一、陣列
陣列也是一種參考型別,其父類是Object,使用“資料型別[]”宣告,如“int[] array”表示宣告了一個元素型別為int型別的陣列array,
陣列初始化語法:
// 靜態初始化語法,即定義的時候就初始化好了所有的元素 int[] array1 = {100, 55, 30}; // 動態初始化語法,初始化時只定義好陣列中元素的個數,new int[5]表示創建一個 // 有5個int型別元素的陣列,但是并沒有初始化陣列中元素的值,只是賦予了默認值,即 // 基本資料型別的默認值和參考型別的默認值null, int[] array2 = new int[5];
使用陣列時,應注意以下幾點:
- 陣列是一種容器,陣列當中可以存盤基本資料型別的資料,也可以存盤參考資料型別的資料,對于基本資料型別,陣列中存盤的是資料的值,而參考型別,陣列當中存盤的是物件的參考,即記憶體地址,
- 陣列因為是參考型別,所以陣列物件是存盤在堆記憶體當中的,
- 陣列一旦創建,其長度是不可變的,
- 陣列中的元素的資料型別是統一的,如int陣列則表示此陣列中的元素全部都是int型別的,
- 所有陣列物件都有length屬性(注意不是length方法),用來獲取陣列中元素的個數,
- 陣列中在存盤時,陣列中的元素的記憶體地址都是連續的,
- 陣列物件的記憶體地址是陣列中第一個元素所在的記憶體地址,
- 使用下標訪問陣列時,如果下標超出了陣列的長度,則會發生ArrayIndexOutOfBoundsException例外,
陣列的訪問和賦值:直接通過下標進行訪問和賦值即可,如“array1[0]=22;”,
陣列的優點和缺點:
- 優點:根據下標去檢索元素時效率極高,因為陣列中的元素在空間地址上是連續的,并且每個元素占用的記憶體空間是相同的,檢索某個元素時只需要根據陣列記憶體地址的起始位置就可以算出這個元素的記憶體地址,所以檢索第100個元素和第100萬個元素的地址的時間都是一樣的,
- 缺點:一個是,為了保證陣列中每個元素的記憶體地址連續性,所以在陣列中間的某個位置洗掉或增加元素時,會涉及到元素的向前或者向后位移的操作,此時的效率就會極低,另外一個是,陣列不能存盤大資料量,因為很難在記憶體空間上找到一塊特別大的連續的記憶體空間,
陣列擴容:Java中陣列擴容的原理或者說方法是將小容量的陣列使用“System.arraycopy”方法拷貝到大容量的陣列當中,然后洗掉小容量的陣列,Java中陣列的擴容效率是較低的,所以在陣列的使用當中,應該盡量避免陣列的拷貝和擴容,
二維陣列:二維陣列,包括三位陣列等多維陣列,其實就是陣列中的元素又是一個陣列,多少維其實由這個陣列的元素“套了多少層”決定的,二維就是陣列中的元素是一個一維陣列,同理,三位陣列中的元素是一個二維陣列,然后以此類推即可,
// 靜態初始化語法 int[][] a = { {1, 2, 3}, {4, 5, 6}, {9} }; // 動態初始化語法 int[][] array = new int[3][4];
Arrays工具類:這個工具類最常用的就是sort和binarySearch這兩個方法,但是注意,二分查找方法的前提是陣列已經排好序了,
import java.util.Arrays; public class ArrayToolsTest{ public static void main(String[] args){ int[] myArray = {3, 2, 6, 4}; // sort方法可以將一個陣列排序,但是注意,sort方法并沒有回傳值, // 即不是回傳排好序的陣列,而是直接排序傳入的陣列 Arrays.sort(myArray); // 二分查找演算法的前提是需要陣列已經排好序了 // 回傳值為元素在陣列中的下標,元素在陣列中不存在則回傳-1 // 但是這個方法多用來判斷陣列中有沒有這個元素,因為如果陣列中該元素 // 不只一個的話,那么回傳的下標不一定是第一個元素的下標 int indexd = Arrays.binarySearch(myArray, 6); } }
二、例外
1、對例外的理解
例外也是類,每一個例外類都可以創建例外物件,
例外繼承結構:通過幫助檔案中可以看到,java.lang.Object --> java.lang.Throwable,而Throwable下有兩個子類Error和Exception,它們都是可以拋出的,對于這兩個子類分支,Error分支下的子類(包括Error自身)稱之為錯誤,錯誤一旦發生,通常是直接就退出程式了,沒有辦法及時去處理,而Exception分支下的子類(包括Exception自身)稱之為例外,例外是可以在代碼層面提前去處理的,Exception的子類又可以分為兩個分支,一個分支是RuntimeException及其子類,稱為運行時例外,另一個分支就是除RuntimeException外的其它Exception的直接子類,也稱為編譯時例外,
編譯時例外:之所以稱之為編譯時例外,是因為在編譯階段就可以發現并提醒程式員提前處理這種例外,對于這類例外怎么提前去處理,還是得要實際使用中多練才能有更深的體會,
運行時例外:這類例外在編譯時不會報錯,但是編譯通過之后在運行時又會出錯,所以叫運行時例外,比如對于運算式10/0,除數為0肯定是錯的,但是編譯器并不會識別并提醒,編譯通過之后運行的時候肯定就會報錯了,
例外處理:處理例外的方式有兩種,一種是使用throws關鍵字和throw關鍵字,將例外拋出給上一級,讓上一級去處理(上一級此時必須處理這個例外);另一種是使用“try...catch”陳述句把例外捕獲,但是注意,捕獲到了這個例外不一定要去處理它,讓它直接“過”也是允許的,
2、throws拋出例外
throws使用示例:
public class ThrowsTest{ public static void main(String[] args){ // 這里在編譯時會發生錯誤,也就是編譯時例外,之所以有這個例外 // 因為在func定義中有throws關鍵字,表示這個方法在執行程序中可能會發生 // 對應的例外(ClassNotFoundException),所以它的上一級必須去處理 // 這個例外,不處理的話,編譯器就會不通過, func(); } // 使用throws關鍵字拋出可能發生的例外 public static void func() throws ClassNotFoundException{ System.out.println("my func!!!"); // 使用throw手動拋出一個例外 throw new ClassNotFoundException("未找到類例外!"); } }
關于throws的使用,需要注意:
- throws拋出的例外,通常有兩種處理方式,一種是繼續使用throws關鍵字向上一級拋出同樣的例外,即呼叫者自身不處理這個例外,讓再上一級去處理,另一種是使用try...catch陳述句去捕獲拋出的例外,
- Java內置類或者我們自己定義的類如果有使用throws關鍵字,就表示它是編譯時例外,使用的時候必須要去處理它,
- throws拋例外時,既可以拋出具體的例外,也可以拋出它的某個父類例外,最頂級的例外類可以是Exception類,它包含了所有例外,
- 使用throws的時機就是如果這個例外希望呼叫者來處理,那么就是用throws拋出它,其他情況應該使用try捕獲的方式,
3、try捕獲例外
try使用示例:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class ExceptionTest { public static void main(String[] args) { FileInputStream fis = null; try { // 將可能會發生例外的陳述句放在try的陳述句塊中 // try陳述句塊中的代碼一定會去執行,直到發生例外為止 fis = new FileInputStream("Z:\\Study\\temp.md"); System.out.println(10 / 0); } catch (ArithmeticException e) { // 捕獲可能會發生的例外 // 捕獲到例外后,對例外進行處理 // catch陳述句塊中的代碼只有捕獲到例外之后才會執行 // ArithmeticException e這個陳述句相當于是宣告一種參考型別的變數,類似于方法的形參,e保存的是例外物件的記憶體地址,并且可以在catch陳述句塊中去使用這個物件參考e, System.out.println("發生算術例外!!!"); } catch (FileNotFoundException e) { // 可以使用多個catch陳述句塊捕獲不同的例外 // 多個catch時會從上到下依次捕獲,執行了一個catch之后,其他的catch就不會執行了 // 并且多個catch陳述句時,應該遵循從上到下的“從小到大”捕獲,即具體例外在前,它的父型別依次往后 System.out.println("檔案不存在!!!"); } finally { // finally塊中的陳述句無論是否發生例外都會處理,哪怕try塊最后有個return陳述句 // 執行到return陳述句時也會先執行finally中的陳述句,再執行return // 可以用來處理一些無論是否發生例外都要處理的操作,如關閉檔案流等 if (fis != null){ try{ fis.close(); } catch(IOException e) { e.printStackTrace(); } } System.out.println("關閉檔案等其他操作,,,"); } } }
注意,catch捕獲的例外可以是具體的例外,也可以是具體例外的父型別例外,此時可以理解為多型,
例外物件中的常用方法:
- getMessage():獲取例外的簡單描述資訊,
- printStackTrace():列印例外追蹤的堆疊資訊,
4、自定義例外
自定義的例外類需要繼承Exception或者RuntimeException,并且需要定義無參和有參兩個構造方法,
public class MyException extends Exception{ public MyException{ } public MyException(String s){ super(s); } }
自定義例外中的方法重寫或者覆寫時需要注意一個語法問題,重寫的方法拋出的例外不能比父類的方法更大或者說更寬泛,只能更小或者說更具體,比如父類例外方法拋出了IOException例外,那么例外子類中重寫這個方法時就不能拋出Exception例外,但是可以拋出IOException例外或者FileNotFoundException例外,
三、泛型
泛型在使用尖括號“<識別符號1,識別符號2,...>”來表示,識別符號代表的是某種型別,
泛型的作用其實是用它定義了一個模板,定義時并沒有寫死資料的型別,當真正使用的時候可以根據需要傳入自己的資料型別,
自定義泛型:
/* 自定一個泛型只需要在類名之后使用<識別符號>即可 注意,此處的識別符號是隨意定義,就像變數名一樣 */ public class MyGenericTest<T> { public static void main(String[] args) { // 定義的時候,傳入的型別是什么,那么創建的物件使用的泛型型別就是什么型別 MyGenericTest<String> mgt = new MyGenericTest<>(); mgt.func("自定義泛型方法測驗!"); } /* 如果想要使用泛型定義的型別,在方法引數中直接使用即可 */ public void func(T t){ System.out.println(t); } }
集合中泛型的應用:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class GenericTest { public static void main(String[] args) { // 指定集合中的元素型別為Pet,不能存盤其它型別的元素 // 使用new的時候可以不用再傳入型別了,可以自動推斷,此時的運算式<>也稱為鉆石運算式 // 如果不指定泛型,也是可以的,默認就是Object型別 List<Pet> petList = new ArrayList<>(); Cat c = new Cat(); Dog d = new Dog(); petList.add(c); petList.add(d); // 迭代器的宣告也需要加上泛型的定義 Iterator<Pet> it = petList.iterator(); while (it.hasNext()) { // 原本next方法回傳值的型別為Object,使用泛型之后回傳的型別直接就是指定 // 的型別,不需要進行型別轉換了, Pet p = it.next(); p.play(); // 當然,如果要使用具體的子類物件的方法,還是需要轉型之后才能呼叫 if (p instanceof Cat){ Cat myCat = (Cat)p; myCat.sleep(); } if (p instanceof Dog){ Dog myDog = (Dog)p; myDog.bark(); } } /* 輸出結果: 寵物在玩耍! 貓咪在睡覺! 寵物在玩耍! 狗子在嚎叫! */ } } class Pet { public void play() { System.out.println("寵物在玩耍!"); } } class Cat extends Pet { public void sleep() { System.out.println("貓咪在睡覺!"); } } class Dog extends Pet { public void bark() { System.out.println("狗子在嚎叫!"); } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168602.html
標籤:Java
