1. 程式人生 > 其它 >java修煉指南-讀書筆記

java修煉指南-讀書筆記

重寫equals方法

對於使用instanceof和getClass()運算子有如下建議:
1)如果子類能夠擁有自身相等的概念,則對稱性需求將強制採用getClass進行檢測。
2)如果有超類決定相等的概念,那麼就可以使用instanceof進行檢測,這樣可以在不同子類的物件之間進行相等的比較。

一個完美的equals方法重寫

1)顯示引數命名為otherObject,稍後會將它轉換成另一個稱為other的變數。
2)判斷比較的兩個物件引用是否相等,如果引用相等則表示是同一個物件。
3)如果otherObject為null,則直接返回false,表示不相等。比較this和otherObject是否是同一個類:
如果equals的語義在每個子類中有所改變,就使用getClass檢測;如果所有的子類都有統一的定義,那麼使用instanceof檢測。
4)將otherObject轉換成對應的型別變數。
5)最後對物件的屬性進行比較。使用 == 比較基本型別,使用equals比較物件。如果都相等則返回true,否則返回false。注意如果是在子類中定義equals,則要包含super. equals(other)。

hashCode

當集合要新增新的元素時,先呼叫這個元素的hashCode方法,就能定位到它應該放置的物理位置上
當定位到的位置已經有元素時,呼叫equals方法判斷元素是否一樣,如果是一樣則表示已經存在該元素
則將新的元素插入到已有元素的後面

建立物件的5種方式

1.new
2.通過Class類的newInstance()方法
Person p2 =Class.forName("com.kkb.tz.bean.Person").newInstance();
3.通過Constructor類的newInstance方法
Person p3 = Person.class.getConstructors()[0].newInstance();


4.使用clone方法
Person p4=(Person)p3.clone();
5.反序列化

基本型別和引用型別

深拷貝和淺拷貝

1.淺拷貝:直接實現clone介面,然後重寫clone方法
2.深拷貝:
在clone方法中對引用型別做複製操作
利用序列化和反序列化,
如果有某個屬性不需要序列化,可以將其宣告為transient,即將其排除在克隆屬性之外

String的陣列

雖然String中的陣列是final修飾的,只能保證引用是不可變的,如果有方法能夠改變陣列的值,依舊能改變資料
可以通過反射將字串的內容改變
eg:

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String str = "vae";
        System.out.println(str);
        Field fieldStr =  String.class.getDeclaredField("value");
        fieldStr.setAccessible(true);
        char[] value = (char[]) fieldStr.get(str);
        value[0]='a';
        System.out.println(str);
    }

一般很少會用反射去修改字串的值,所以一般是認為字串是不可變的
hashCode,當String被創建出來的時候,hashCode也會隨之被快取,hashCode的計算與value有關,若String可變,那麼hashCode也會隨之變化,針對Map、Set等容器,它們的鍵值需要保證唯一性和一致性,因此,String的不可變性使其比其他物件更適合當容器的鍵值