Java基礎(二) | 零碎知識小貼士

weixin_33724059發表於2017-06-20

特意將零碎的知識點都整理出來,方便快速查閱。

一、過載與重寫

  • 重寫:發生在子類中;與父類函式名相同,引數列表相同;返回值小於等於父類;訪問許可權大於等於父類;丟擲異常小於等於父類;
  • 過載:在用一個類中,方法名相同,引數列表不同,包括引數個數、型別和順序;返回值和訪問權性可以相同,也可以不同;(注意子類繼承父類中的過載與重寫的區分)

二、類中成員的初始化順序

  • 原則:
    父類中靜態成員和靜態程式碼塊,按照程式碼順序依次載入;
    子類中靜態成員和靜態程式碼塊,按照程式碼順序依次載入;
    父類中例項成員和例項程式碼塊,按照程式碼順序依次載入;
    父類中的構造方法開始初始化;
    子類中例項成員和例項程式碼塊,按照程式碼順序依次載入;
    子類中的構造方法開始初始化;

三、序列化與反序列化

  • 序列化是將Java物件轉化為位元組序列,反序列化是將位元組序列轉化為Java物件;
  • 序列化一方面實現資料的持久化,另一方面實現Java程式間物件通訊
//Student類實現Serializable介面,transient關鍵字修飾屬性不能序列化
  public static void main(String[] args) {
        Student s = new Student("lvziwei",22,"Xidian");
        File file = new File("D://s.txt");
        try {
            file.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try{
            //序列化物件,輸入輸出流的判別標準為從記憶體中讀為輸出流,向記憶體中寫為輸入流
            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(s);
            oos.flush();
            oos.close();
            fos.close();
            
            //反序列化物件
            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fis);
            Student ss = (Student) ois.readObject();
            fis.close();
            ois.close();
            System.out.println(ss.getSchool() + "->" + ss.getAge() + "->" + ss.getName());
        }catch(Exception e){
            e.printStackTrace();
        }   
    }

四、自動裝箱與拆箱

  • 裝箱,將基本型別用它們對應的引用型別包裝起來;拆箱,將包裝型別轉換為對應的基本型別;
  • 編譯器在編譯期間,根據語法決定是否進行自動拆箱和裝箱操作,減少常用數值的記憶體開銷和建立物件開銷;
// 下面以int為例解釋
Integer i = 10; //自動裝箱 Integer i = Integer.valueOf(10);
int i2 = i; //自動拆箱 int i2 = Integer.intValue(i);

Integer a = 10;
Integer b = 10;
System.out.println("i == b : " + (a == b)); //true 
Integer a1 = 200;
Integer b1 = 200;
System.out.println("i1 == b1 : " + (a1 == b1)); //false

//原因解釋 IntegerCache.low = -128 IntegerCache.high = 127
public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
//自動裝箱時,如果整數值在-128~127之間,則自動返回快取值;
//不在此範圍內,則自動新建物件;
// 下面以String為例解釋
 String str1 ="abc";
 String str2 ="abc";
 System.out.println(str2==str1); //輸出為 true
 System.out.println(str2.equals(str1)); //輸出為 true
 
 String str3 =new String("abc");
 String str4 =new String("abc");
 System.out.println(str3==str4); //輸出為 false
 System.out.println(str3.equals(str4)); //輸出為 true 

// 原因解釋 "==" : 引用是否相同 "equals()" : 比較物件內容是否相同
// 字串物件為不可改變物件,返回自身引用

五、Collection與Collections的區別

  • java.util.Collection 是集合類的頂級介面,為集合物件的操作提供通用介面;Java類中有大量的具體實現;
  • java.util.Collections 是一種包裝類,包含有對集合操作的多種靜態多型的方法;

六、序列號serialVersionUID

  • 作用
    確保版本間的相容性,版本指的是Java類的版本;
  • 生成方式
    預設生成方式,serialVersionUID = 1L;
    由類名、介面名、成員方法和屬性生成雜湊值;
  • 作用原理
    如果沒有顯示宣告,則會自動生成,序列化操作後儲存在檔案中;反序列化時,JVM從檔案中讀取該值,與該類自動生成的值進行比較,相同則可以進行序列化;如果在序列化之後,反序列化之前,對類進行修改,則會重新生成新的值,此時不能進行反序列化;建議使用顯示宣告預設的序列化值;

七、Iterable和Iterator的區別

  • 兩者區別
    Iterable是java.lang包中的介面,呼叫iterator()方法,返回Iterator物件;
    Iterator是java.util包中的介面,具有hasnext()和next()方法;
    Collection介面繼承於Iterable介面;
  • 設計兩者同時存在的原因
    使用foreach(for增強)的類,均需要實現Iterable介面;
    Collection的子類集合均是資料結構,而Iterator為迭代物件,設計者希望一種資料結構有多種迭代物件;
    每次呼叫Iterable的iterator()方法,均會返回一個Iterator物件;

八、Map.Entry

  • 概念
    Map是Java的介面,Map.Entry是Map中宣告的內部介面,儲存Map的一個實體,其包含一個鍵值對;Map的entrySet返回一個型別為Map.Entry的集合;

九、Collection中的toArray()方法

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        Object[] i = list.toArray();
        Integer[] i = list.toArray();// 錯誤,只能轉換為Object型別
        Integer[] ii = list.toArray(new Integer[0]);// 新建的陣列長度隨意,僅提供陣列型別即可
    }

十、Java的跨平臺性

  • Java由與平臺無關的編譯器生成位元組碼檔案(.class檔案),由與平臺相關的解析器(不同平臺的JVM)解析執行,來實現跨平臺;

十一、switch支援的資料型別

  • switch支援byte、short、int和char四種基本型別,列舉和String型別;
    同時因為自動拆箱機制,支援四種基本資料型別的包裝類;
public class TypeTest {
    public static void main(String[] args) {
        switch (new Integer(1)) {
        case 0:
            System.out.println("The num is : 0");
            break;
        case 1:
            System.out.println("The num is : 1");
            break;
        default:
            System.out.println("The num is null");
            break;
        }
    }
}
The num is : 1
// 基於Jclasslib檢視位元組碼檔案
 0 new #16 <java/lang/Integer>
 3 dup
 4 iconst_1
 5 invokespecial #18 <java/lang/Integer.<init>>
 8 invokevirtual #21 <java/lang/Integer.intValue> //此處實現自動拆箱,呼叫intValue方法
11 tableswitch 0 to 1   0:  32 (+21)
    1:  43 (+32)
    default:  54 (+43)
32 getstatic #25 <java/lang/System.out>
35 ldc #31 <The num is : 0>
37 invokevirtual #33 <java/io/PrintStream.println>
40 goto 62 (+22)
43 getstatic #25 <java/lang/System.out>
46 ldc #39 <The num is : 1>
48 invokevirtual #33 <java/io/PrintStream.println>
51 goto 62 (+11)
54 getstatic #25 <java/lang/System.out>
57 ldc #41 <The num is null>
59 invokevirtual #33 <java/io/PrintStream.println>
62 return

十二、JUC原子類

十三、小數計算精度

相關文章