------- android培訓、java培訓、期待與您交流! ----------
19.01 集合的特點和數據結構總結


HashSet、HashMap、Hashtable判斷元素唯一性的方式:
通過對象的hashCode和equals方法來完成元素唯一性
如果對象的hashCode值不同,那么不用判斷equals方法,就直接存儲到哈希表中。
如果對象的hashCode值相同,那么要再次判斷對象的equals方法是否為true。
如果為true,視為相同元素,不存。如果為false,那么視為不同元素,就進行存儲。
最終:自動生成hashCode()和equals()即可
TreeSet、TreeMap判斷元素唯一性的方式:根據比較的返回的是否是0來決定
TreeSet排序:
1.自然排序,一個類的元素想要進行自然排序就必須實現自然排序接口Comparable(元素具備比較性)
2.比較器排序,讓集合的構造方法接收一個比較器接口的子類對象Comparator(集合具備比較性)
19.02 如何選擇使用哪種集合
19.03 集合常見功能和遍歷方式總結
集合的常見方法及遍歷方式
Collection:add()、remove()、contains()、iterator()、size()
遍歷:增強for、迭代器
Collection子類List:get()
遍歷:普通for
Collection子類Set
Map:put()、remove()、containskey()、containsValue()、keySet()、get()、value()、entrySet()、size()
遍歷:根據鍵找值、根據鍵值對對象分別找鍵和值
19.04 異常的概述和分類異常:異常就是Java程序在運行過程中出現的錯誤。

異常的分類:
1.編譯時被檢測異常:只要是Exception和其子類都是,除了特殊子類RuntimeException體系。
這種問題一旦出現,希望在編譯時就進行檢測,讓這種問題有對應的處理方式,這樣的問題都可以針對性的處理。
2.編譯時不檢測異常(運行時異常): 就是Exception中的RuntimeException和其子類。
這種問題的發生,無法讓功能繼續,運算無法進行,更多是因為調用者的原因導致的而或者引發了內部狀態的改變導致的。
那么這種問題一般不處理,直接編譯通過,在運行時,讓調用者調用時的程序強制停止,讓調用者對代碼進行修正。
19.05 JVM默認處理異常如果程序出現了問題,我們沒有做任何處理,最終jvm會做出默認的處理。
把異常的名稱,原因及出現的問題等信息輸出在控制臺,同時會結束程序
19.06 try...catch的方式處理異常1(一個異常)異常處理方案:
1.try...catch...finally
2.throws
try...catch...finally格式:
try { 可能出現問題的代碼;}catch(異常名 變量) { 針對問題的處理;}finally { 釋放資源;}變形格式:
try { 可能出現問題的代碼;}catch(異常名 變量) { 針對問題的處理;}注意:
A:try里面的代碼越少越好
B:catch里面必須有內容,哪怕是給出一個簡單的提示
例:
1 try 2 {3 System.out.PRintln(5/0);4 } 5 catch (ArithmeticException e) 6 {7 System.out.println("除數不能為0");8 }19.07 try...catch的方式處理異常2(兩個異常)
例:
int[] arr = {1,2,3};try { System.out.println(arr[3]); System.out.println(5/0);} catch (ArithmeticException e) { System.out.println("除數不能為0");}catch (ArrayIndexOutOfBoundsException e){ System.out.println("索引越界");}注意:一旦try里面出了問題,就會在這里把問題給拋出去,然后和catch里面的問題進行匹配,一旦有匹配的,就執行catch里面的處理,然后結束了try...catch,繼續執行后面的語句。
注意事項:1:能明確的異常盡量明確,不要用大的來處理。
2:平級關系的異常誰前誰后無所謂,如果出現了子父關系,父必異常須在后面。
19.08 JDK7針對多個異常的處理方案JDK7出現了一個新的異常處理方案:
try{}catch(異常名1 | 異常名2 | ... 變量 ) {...}例:
1 int[] arr = {1,2,3}; 2 try 3 { 4 System.out.println(arr[3]); 5 System.out.println(5/0); 6 } 7 catch (ArithmeticException | ArrayIndexOutOfBoundsException e) 8 { 9 System.out.println("出現問題");10 }注意:
A:異常的處理方式必須是一致的。(在實際開發中很多時候可能就是針對同類型的問題,給出同一個處理)
B:多個異常間必須是平級關系。
19.09 編譯期異常和運行期異常的區別編譯時異常:Java程序必須顯示處理,否則程序就會發生錯誤,無法通過編譯
運行時異常:無需顯示處理,也可以和編譯時異常一樣處理
19.10 Throwable的幾個常見方法1.public String getMessage():
返回此 throwable 的詳細消息字符串。
2.public String toString():
返回此 throwable 的簡短描述。結果是以下字符串的串聯:
此對象的類的 name + ": "(冒號和一個空格) + 調用此對象 getLocalizedMessage() 方法的結果
如果 getLocalizedMessage 返回 null,則只返回類名稱。
3.public void printStackTrace():
將此 throwable 及其追蹤輸出至標準錯誤流。
4.public void printStackTrace(PrintStream s):
將此 throwable 及其追蹤輸出到指定的輸出流。
19.11 throws的方式處理異常定義功能方法時,需要把出現的問題暴露出來讓調用者去處理。那么就通過throws在方法上標識。
例:
public class Practice { public static void main(String[] args) { //method1();//需要處理 method2();//不需要處理 } // 運行期異常的拋出 public static void method2() throws ArithmeticException { System.out.println(5 / 0); } // 編譯期異常的拋出,在方法聲明上拋出,是為了告訴調用者方法有問題。 public static void method1() throws ParseException { String s = "2014-11-11"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(s); }}小結:
編譯期異常拋出,將來調用者必須處理。
運行期異常拋出,將來調用可以不用處理。
19.12 throw的概述以及和throws的區別在功能方法內部出現某種情況,程序不能繼續運行,需要進行跳轉時,就用throw把異常對象拋出。
例:
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 // method1();//需要處理 6 method2();//不需要處理 7 } 8 9 public static void method2()10 {11 int a = 10;12 int b = 0;13 if(b == 0)14 // 運行期異常的拋出15 throw new ArithmeticException();16 else17 System.out.println(a / b);18 }19 // 編譯期異常的拋出,在方法聲明上拋出20 public static void method1() throws Exception21 {22 int a = 10;23 int b = 0;24 if(b == 0)25 //throw:如果出現了異常情況,我們可以把該異常拋出,這個時候的拋出的應該是異常的對象26 throw new Exception();27 else28 System.out.println(a / b);29 }30 }throws和throw的區別
throws
1.用在方法聲明后面,跟的是異常類名
2.可以跟多個異常類名,用逗號隔開
3.表示拋出異常,由該方法的調用者來處理
4.throws表示出現異常的一種可能性,并不一定會發生這些異常
throw
1.用在方法體內,跟的是異常對象名
2.只能拋出一個異常對象名
3.表示拋出異常,由方法體內的語句處理
4.throw則是拋出了異常,執行throw則一定拋出了某種異常
19.13 如何處理異常原則:如果該功能內部可以將問題處理,用try,如果處理不了,交由調用者處理,這是用throws
區別:
后續程序需要繼續運行就try
后續程序不需要繼續運行就throws
19.14 finally關鍵字的特點及作用finally的特點:被finally控制的語句體一定會執行
特殊情況:在執行到finally之前jvm退出了(比如System.exit(0))
finally的作用:用于釋放資源,在IO流操作和數據庫操作中會見到
19.15 面試題之final,finally和finalize的區別final,finally和finalize的區別
final:最終的意思,可以修飾類,成員變量,成員方法
修飾類,類不能被繼承。修飾變量,變量是常量。修飾方法,方法不能被重寫
finally:是異常處理的一部分,用于釋放資源。一般來說,代碼肯定會執行,特殊情況:在執行到finally之前jvm退出了
finalize:是Object類的一個方法,用于垃圾回收
面試題之如果在finally之前有return
如果catch里面有return語句,請問finally里面的代碼還會執行嗎
會,執行完return語句后會執行finally語句,之后回到return語句執行
19.16 異常處理的變形try...catch...finally的格式變形
A:try...catch...finally
B:try...catch
C:try...catch...catch...
D:try...catch...catch...finally
E:try...finally:這種做法的目前是為了釋放資源。
19.17 自定義異常的實現和測試自定義異常:繼承Exception或者繼承RuntimeException
例:
自定義異常類:
1 public class MyException extends Exception 2 { 3 MyException() 4 {} 5 MyException(String s) 6 { 7 //調用父類帶參構造 8 super(s); 9 }10 }測試類:
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 try 6 { 7 method(101); 8 } 9 catch (MyException e) 10 {11 e.printStackTrace();12 }13 }14 public static void method(int i) throws MyException15 {16 if(i > 100 || i < 0)17 throw new MyException("分數錯誤");18 else19 System.out.println(i);20 }21 }19.18 異常的注意事項
1.子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。
2.如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常
3.如果被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那么子類只能try,不能throws
19.19 File類的概述和構造方法File類的概述:文件和目錄路徑名的抽象表示形式
構造方法:
1.public File(String pathname):
通過將給定路徑名字符串轉換為抽象路徑名來創建一個新 File 實例。
2.public File(String parent,String child):
根據 parent 路徑名字符串和 child 路徑名字符串創建一個新 File 實例。
3.public File(File parent,String child):
根據 parent 抽象路徑名和 child 路徑名字符串創建一個新 File 實例。
例:
1 // 把d://demo//a.txt封裝成一個File對象2 File f = new File("d://demo//a.txt");3 4 // 根據一個目錄和一個子文件/目錄得到File對象5 File file2 = new File("E://demo", "a.txt");6 7 // 根據一個父File對象和一個子文件/目錄得到File對象8 File file3 = new File("e://demo");9 File file4 = new File(file3, "a.txt");19.20 File類的創建功能
1.public boolean createNewFile()throws IOException
當且僅當不存在具有此抽象路徑名指定名稱的文件時,不可分地創建一個新的空文件。
2.public boolean mkdir()
創建此抽象路徑名指定的目錄。
3.public boolean mkdirs()
創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。注意,此操作失敗時也可能已經成功地創建了一部分必需的父目錄。
例:
1 // 在d盤創建一個文件夾demo 2 File f1 = new File("d://demo"); 3 //創建文件夾,文件夾存在則不創建 4 System.out.println(f1.mkdir()); 5 6 //在d盤demo文件夾下創建一個文件a.txt 7 File f2 = new File("d://demo//a.txt"); 8 //創建文件,文件存在則不創建 9 //要想在某個目錄下創建內容,該目錄首先必須存在10 System.out.println(f2.createNewFile());11 12 //在d盤test文件夾下創建一個文件夾aaa13 File f3 = new File("d://test//aaa");14 //創建多級文件夾,文件存在則不創建15 System.out.println(f3.mkdirs());19.21 File類的刪除功能
public boolean delete():
刪除此抽象路徑名表示的文件或目錄。如果此路徑名表示一個目錄,則該目錄必須為空才能刪除。
刪除文件
刪除文件夾:文件夾內有東西是不能刪除,刪除多級文件夾只會刪除最里層的文件夾
19.22 File類的重命名功能public boolean renameTo(File dest):重新命名此抽象路徑名表示的文件。
例:

19.23 File類的判斷功能
1.public boolean isDirectory():
測試此抽象路徑名表示的文件是否是一個目錄。
2.public boolean isFile():
測試此抽象路徑名表示的文件是否是一個標準文件。
3.public boolean exists():
測試此抽象路徑名表示的文件或目錄是否存在。
4.public boolean canRead():
測試應用程序是否可以讀取此抽象路徑名表示的文件。
5.public boolean canWrite():
測試應用程序是否可以修改此抽象路徑名表示的文件。
6.public boolean isHidden():
測試此抽象路徑名指定的文件是否是一個隱藏文件。
19.24 File類的獲取功能1.public String getAbsolutePath():
返回此抽象路徑名的絕對路徑名字符串。
2.public String getPath():
將此抽象路徑名轉換為一個路徑名字符串。
3.public String getName():
返回由此抽象路徑名表示的文件或目錄的名稱。
4.public long length():
返回由此抽象路徑名表示的文件的長度。
5.public long lastModified():
返回此抽象路徑名表示的文件最后一次被修改的時間。
例:
File f = new File("a.txt");System.out.println("getAbsolutePath:"+f.getAbsolutePath());System.out.println("getPath:"+f.getPath());System.out.println("getName:"+f.getName());System.out.println("length:"+f.length());System.out.println("lastModified:"+f.lastModified());運行結果:
getAbsolutePath:D:/Develop/Eclipse_WorkSpace/day11/a.txtgetPath:a.txtgetName:a.txtlength:30lastModified:1432621909937
19.25 File類的高級獲取功能
1.public String[] list():
返回一個字符串數組,這些字符串指定此抽象路徑名表示的目錄中的文件和目錄。
2.public File[] listFiles():
返回一個抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中的文件。
例:
1 File f = new File("D://"); 2 String[] str = f.list(); 3 for(String s : str) 4 { 5 System.out.println(s); 6 } 7 System.out.println("---------"); 8 File[] files = f.listFiles(); 9 for(File file : files)10 {11 System.out.println(file.getName());12 }19.26 輸出指定目錄下指定后綴名的文件名稱案例
判斷D盤目錄下是否有后綴名為.java的文件,如果有,就輸出此文件名稱
分析:
A:封裝e判斷目錄
B:獲取該目錄下所有文件或者文件夾的File數組
C:遍歷該File數組,得到每一個File對象,然后判斷
D:是否是文件且是否以.jpg結尾,是就輸出該文件名稱
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 File f = new File("D://"); 6 // 獲取該目錄下所有文件或者文件夾的File數組 7 File[] files = f.listFiles(); 8 // 遍歷該File數組,得到每一個File對象,然后判斷 9 for(File file : files)10 {11 if(file.isFile() && file.getName().endsWith(".java"))12 System.out.println(file.getName());13 }14 }15 }19.27 文件過濾器改進輸出指定目錄下指定后綴名的文件名稱案例
文件名稱過濾器
1.public String[] list(FilenameFilter filter):
返回一個字符串數組,這些字符串指定此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。
2.public File[] listFiles(FilenameFilter filter):
返回抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 File f = new File("D://"); 6 String[] str = f.list(new FilenameFilter()//傳入過濾器 7 { 8 @Override 9 public boolean accept(File dir, String name) 10 {11 File f = new File(dir, name);12 return f.isFile() && f.getName().endsWith(".java");13 }14 });15 for(String s : str)16 {17 System.out.println(s);18 }19 }20 }19.28 帶文件名稱過濾器的list()方法的源碼
1 public String[] list(FilenameFilter filter) 2 { 3 String names[] = list(); 4 if ((names == null) || (filter == null)) 5 { 6 return names; 7 } 8 List<String> v = new ArrayList<>(); 9 for (int i = 0 ; i < names.length ; i++) 10 {11 if (filter.accept(this, names[i])) 12 {13 v.add(names[i]);14 }15 }16 return v.toArray(new String[v.size()]);17 }19.29 批量修改文件名稱案例
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 // 封裝目錄 6 File srcFolder = new File("E://評書//三國演義"); 7 8 // 獲取該目錄下所有的文件的File數組 9 File[] fileArray = srcFolder.listFiles();10 11 // 遍歷該File數組,得到每一個File對象12 for (File file : fileArray) 13 {14 // E:/評書/三國演義/三國演義_001_[評書網-今天很高興,明天就IO了]_桃園三結義.avi15 // 改后:E:/評書/三國演義/001_桃園三結義.avi16 String name = file.getName(); // 獲取三國演義_001_[評書網-今天很高興,明天就IO了]_桃園三結義.avi17 18 int index = name.indexOf("_");19 String numberString = name.substring(index + 1, index + 4); //獲取00120 21 int endIndex = name.lastIndexOf('_');22 String nameString = name.substring(endIndex);//獲取_桃園三結義.avi23 24 String newName = numberString.concat(nameString); // 001_桃園三結義.avi25 26 File newFile = new File(srcFolder, newName); // E://評書//三國演義//001_桃園三結義.avi27 28 // 重命名即可29 file.renameTo(newFile);30 }31 }32 }新聞熱點
疑難解答