java 15
1、Collections
Collections:是java針對集合操作專門提供的一個工具類
靜態方法
public static <T> void sort(List<T> list)
public static <T> int binarySearch(List<?> list,T key)
public static <T> T max(Collection<?> coll)
public static void reverse(List<?> list)
public static void shuffle(List<?> list)
運用示例
public class CollectionsDemo1 {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
list1.add(34);
list1.add(7);
list1.add(12);
list1.add(734);
list1.add(38);
list1.add(29);
System.out.println(list1);
System.out.println("-------------------------------");
//public static <T> void sort(List<T> list)
Collections.sort(list1); // 底層是呼叫了Arrays工具類中的sort方法
System.out.println(list1);
//public static <T> int binarySearch(List<?> list,T key)
// 二分查詢【前提是序列是有序的】
//[7, 12, 29, 34, 38, 734]
System.out.println(Collections.binarySearch(list1, 100));
//public static <T> T max(Collection<?> coll) 求集合中最大值
System.out.println(Collections.max(list1));
ArrayList<String> list2 = new ArrayList<>();
list2.add("hello");
list2.add("world");
list2.add("java");
list2.add("apple");
list2.add("hadoop");
System.out.println(Collections.max(list2));
//public static void reverse(List<?> list)
Collections.reverse(list1);
System.out.println(list1);
System.out.println("===========================");
//public static void shuffle(List<?> list) 隨機打亂元素
Collections.shuffle(list1);
System.out.println(list1); // [34, 734, 38, 7, 12, 29] [34, 12, 7, 38, 29, 734]
}
}
我們在說Vector類的時候,說到即便是安全的,我們也不會用它。使用Collections工具類可以將任意一個不安全的集合類變成一個執行緒安全的集合類
Collections.synchronizedList()
public class CollectionsDemo2 {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
Vector<Integer> v1 = new Vector<>();
// List<Integer> list2 = Collections.synchronizedList(list1);
// list2.add(1);
// list2.add(1);
// list2.add(1);
// for (Integer i : list2) {
// System.out.println(i);
// }
}
}
2、遞迴
遞迴:方法定義時內部呼叫自身的現象
fun1().fun2() 這叫方法的鏈式呼叫
fun1(show1()) 這叫方法的巢狀呼叫
寫遞迴需要考慮的東西
1、開始條件
2、出口
遞迴故事:
1、從前有座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故事,講的故事內容: 1
從前有座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故事,講的故事內容: 2
從前有座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故事,講的故事內容: 3
從前有座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故事,講的故事內容: 4
....
結束條件:山倒了,老和尚圓寂了。
2、來數加學習大資料,找工作,掙錢,娶老婆,生娃:
來數加學習大資料,找工作,掙錢,娶老婆,生娃:
來數加學習大資料,找工作,掙錢,娶老婆,生娃:
...
結束條件:掙不到錢,沒有生娃...
需求:使用遞迴實現一個數的階乘
public class DiGui {
public static void main(String[] args) {
int n = 4;
System.out.println(n+"的階乘為"+JieChen(n));
}
public static int JieChen(int n){
if(n==1){
return 1;
}else{
return n*JieChen(--n);
}
}
}
3、異常處理
什麼叫異常
異常:java程式編譯或執行過程中出現的問題
Throwable:
Error: 表示非常嚴重的問題,自己無法解決的問題
Exception:
除了RuntimeException其它異常【編譯時期異常】: 一般指的是異常尚未處理就編譯了
RuntimeException【執行時期異常】: 執行過程中報錯了,一般情況下是因為語法邏輯不正確導致
JVM遇到問題時,預設的處理方案是:停止程式,丟擲錯誤。
異常的處理方案
1、try...catch...finally
try...catch使用注意事項
1、當try中出現異常時,JVM會對應建立一個異常類物件
2、自上而下會與catch中的異常進行匹配,若匹配上就相當於處理了,執行catch中的邏輯
3、若try中有多個異常,當第一個異常觸發時,try中的其它後續程式碼都不會執行,JVM會對應建立一個異常類物件進行第二步匹配
4、可以直接寫一個catch裡面是所有異常的父類、
5、若存在多個catch匹配,需要將父類異常往後寫
6、若使用jdk新特性的寫法的話,異常類之間不能存在繼承關係
public class ExceptionDemo2 {
public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
// try {
// System.out.println(arr[8]); // new ArrayIndexOutOfBoundsException()
// System.out.println(10/3); // new ArithmeticException()
// System.out.println("江川比李剛帥!");
// }catch (ArrayIndexOutOfBoundsException e){ // = new ArrayIndexOutOfBoundsException()
// System.out.println("出錯啦!!");
// }catch (ArithmeticException e){
// System.out.println("除0錯誤!!");
// }
// try {
// System.out.println(arr[2]); // new ArrayIndexOutOfBoundsException()
// System.out.println(10/0); // new ArithmeticException()
// System.out.println("江川比李剛帥!");
// }catch (ArithmeticException e){
// System.out.println("除0錯誤!!");
// }catch (Exception e){ // = new ArrayIndexOutOfBoundsException()
// System.out.println("出錯啦!!");
// }
try {
System.out.println(arr[8]); // new ArrayIndexOutOfBoundsException()
System.out.println(10 / 3); // new ArithmeticException()
System.out.println("江川比李剛帥!");
} catch (ArrayIndexOutOfBoundsException | ArithmeticException e) { // = new ArrayIndexOutOfBoundsException()
System.out.println("出錯啦!!");
}
System.out.println("李剛真帥!");
}
}
列印異常printStackTrace()
public class ExceptionDemo3 {
public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
// System.out.println(arr[8]);
// System.out.println(3/0);
try {
// System.out.println(arr[8]);
System.out.println(3/0);// new ArrayIndexOutOfBoundsException()
} catch (Exception e) { // = new ArrayIndexOutOfBoundsException()
// System.out.println(e.getMessage());
// System.out.println(e.toString());
//void printStackTrace()
//將此throwable和其追溯列印到標準錯誤流。
e.printStackTrace();
}
System.out.println("李剛是世界首富!!");
}
}
finally
無論try中的程式碼是否出錯,finally都會執行。
finally一般來說,用作釋放資源的作用。
public class ExceptionDemo4 {
public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
try {
System.out.println(3/2);// new ArrayIndexOutOfBoundsException()
} catch (Exception e) { // = new ArrayIndexOutOfBoundsException()
e.printStackTrace();
} finally {
System.out.println("數加666");
}
System.out.println("李剛是世界首富!!");
}
}
throw
在方法的定義上丟擲異常類, throws本身是不會處理異常的,只是當時方法內部不用處理了,
但是當呼叫者呼叫有問題的方法時,需要呼叫者進行處理
throw: 丟擲
在方法內部丟擲異常物件,表示一個確定的異常
注意:
當呼叫者呼叫丟擲執行時期異常的方法時,可以選擇不去處理,也能執行。
當呼叫者呼叫丟擲編譯時期異常的方法是,必須要進行處理,否則編譯不透過無法執行。
小故事理解 throw throws try...catch 的使用:
江川是一個快樂的小礦工,有一天他挖到了一個遠古炸彈💣【throw】,往洞外運輸【throws】,運輸給了礦廠管理人員
管理員對炸彈💣進行處理【try..catch】
public class ThrowsDemo1 {
public static void main(String[] args){
// try {
// fun1();
// }catch (Exception e){
// e.printStackTrace();
// }
// fun1();
//
// System.out.println("hello world");
// try {
// fun2();
// }catch (Exception e){
// e.printStackTrace();
// }
// fun1();
try{
fun3();
}catch (Exception e){
e.printStackTrace();
}
}
public static void fun3() throws Exception{
int i= 0;
if(i==0){
throw new ArithmeticException();
}else {
System.out.println(5/i);
}
}
public static void fun2() throws IOException {
FileInputStream fis = new FileInputStream("");
}
public static void fun1() throws ArithmeticException{
int[] arr = {11, 22, 33, 44, 55};
System.out.println(3 / 0);// new ArrayIndexOutOfBoundsException()
System.out.println("李剛是世界首富!!");
}
}
4、IO流
File【檔案】:
是計算機中所有檔案的抽象表示, 將來File物件目標可能存在,也可能不存在。
構造方法:
public File(String pathname)
public File(String parent,String child)
public File(File parent,String child)
路徑:
絕對路徑【完整路徑】:D:\projects\IdeaProjects\bigdara32\java\src\com\shujia\day15\ketang\a1.txt
相對路徑:java/src/com/shujia/day15/ketang/a1.txt
public class FileDemo1 {
public static void main(String[] args) {
//public File(String pathname)
// File f1 = new File("D:\\projects\\IdeaProjects\\bigdara32\\java\\src\\com\\shujia\\day15\\ketang\\a1.txt");
// System.out.println(f1);
// File f2 = new File("java/src/com/shujia/day15/ketang/a1.txt");
// System.out.println(f2);
//public File(String parent,String child)
// File f1 = new File("D:\\projects\\IdeaProjects\\bigdara32\\java\\src\\com\\shujia\\day15\\ketang","a1.txt");
// System.out.println(f1);
//public File(File parent,String child)
File file = new File("D:\\projects\\IdeaProjects\\bigdara32\\java\\src\\com\\shujia\\day15\\ketang");
File f1 = new File(file, "a1.txt");
System.out.println(f1);
}
}
建立功能
public boolean createNewFile()
public boolean mkdir()
public boolean mkdirs()
刪除功能
public boolean delete()
重新命名功能
public boolean renameTo(File dest)
public class FileDemo2 {
public static void main(String[] args) throws Exception{
File file = new File("java/src/com/shujia/day15/ketang/a1.txt");
//public boolean createNewFile()
// System.out.println(file.createNewFile());
//public boolean mkdir() 建立單極資料夾
// System.out.println(file.mkdir());
//public boolean mkdirs() 建立多極資料夾
// System.out.println(file.mkdirs());
//public boolean delete() 只能刪除空資料夾,或一個檔案
// System.out.println(file.delete());
//public boolean renameTo(File dest)
// File file2 = new File("java/src/com/shujia/day15/ketang/李剛.txt");
// System.out.println(file.renameTo(file2));
}
}
判斷功能
public boolean isDirectory()
public boolean isFile()
public boolean exists()
public boolean canRead()
public boolean canWrite()
public boolean isHidden()
public class FileDemo3 {
public static void main(String[] args) {
File file = new File("java/src/com/shujia/day15/ketang/李剛.txt");
// public boolean isDirectory()
System.out.println(file.isDirectory());
//public boolean isFile()
System.out.println(file.isFile());
//public boolean exists()
System.out.println(file.exists());
//public boolean canRead() 是否可讀
System.out.println(file.canRead());
//public boolean canWrite() 是否可寫
System.out.println(file.canWrite());
//public boolean isHidden() 是否被隱藏
System.out.println(file.isHidden());
}
}
基本獲取功能
public String getAbsolutePath()
public String getPath()
public String getName()
public long length()
public long lastModified()
public class FileDemo4 {
public static void main(String[] args) {
File file = new File("java/src/com/shujia/day15/ketang/李剛.txt");
// public String getAbsolutePath() 獲取絕對路徑
System.out.println(file.getAbsolutePath());
//public String getPath() 獲取相對路徑
System.out.println(file.getPath());
//public String getName() 獲取檔案或資料夾的名字
System.out.println(file.getName());
//public long length() 獲取檔案中位元組數
System.out.println(file.length());
//public long lastModified() 獲取上一次修改的時間戳【毫秒級別的】
// System.out.println(file.lastModified());
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:dd").format(new Date(file.lastModified()));
System.out.println("上一次修改的時間:"+time);
}
}
高階獲取功能
public String[] list()
public File[] listFiles()
public class FileDemo5 {
public static void main(String[] args) {
File file = new File("java/src/com/shujia/day15/ketang");
//public String[] list() 將目錄下所有的檔案以及資料夾的名字放到一個陣列中返回
String[] nameList = file.list();
if(nameList!=null){
for (String s : nameList) {
System.out.println(s);
}
}
// assert nameList!=null;
// for (String s : nameList) {
// System.out.println(s);
// }
//public File[] listFiles() 將目錄下所有的檔案以及資料夾都封裝成一個一個的File物件放到一個陣列中
File[] files = file.listFiles();
if(files!=null){
for (File file1 : files) {
System.out.println(file1);
}
}
}
}
需求:獲取ketang目錄下所有.txt字尾的檔案
public class FileDemo6 {
public static void main(String[] args) {
File file = new File("java/src/com/shujia/day15/ketang");
//獲取當前目錄下所有的檔案或者資料夾的集合
File[] files = file.listFiles();
if(files!=null){
for (File file1 : files) {
if(file1.isFile() && file1.getName().endsWith(".txt")){
System.out.println(file1.getName());
}
}
}
}
}
public String[] list(FilenameFilter filter) //這個方法返回一個字串陣列,包含滿足過濾器條件的檔名。如果沒有滿足條件的檔案,返回一個空陣列。
public File[] listFiles(FilenameFilter filter) //這個方法返回一個File物件陣列,包含滿足過濾器條件的檔案和資料夾。如果沒有滿足條件的檔案或資料夾,返回一個空陣列
public class FileDemo7 {
public static void main(String[] args) {
File file = new File("java/src/com/shujia/day15/ketang");
//public File[] listFiles(FilenameFilter filter)
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 當這裡返回true的時候,表示將檔案放到陣列中
// dir表示當前目錄,name表示檔案或者資料夾名字
File f = new File(dir, name);
return f.isFile() && f.getName().endsWith(".txt");
}
});
if(files!=null){
for (File file1 : files) {
System.out.println(file1);
}
}
}
}