String 、Integer 都是final 修飾的累,都很好的重寫了 hashCode 和 equals方法,最關鍵的他們是Immutable類,為不可變類。可以保證hashCode的穩定性。
思考,為什么我們在HashMap put key 的時候經常使用String 或者Integer?
A:String 、Integer 都是final 修飾的累,都很好的重寫了 hashCode 和 equals方法,最關鍵的他們是Immutable類,為不可變類。可以保證hashCode的穩定性。
不可變類的優點與用途
1. 線程安全,省去了加鎖的過程,因為對象內容不可變就不用擔心線程同時對對象做修改
2. 拷貝效率高。當類不可變時, 拷貝其對象只需拷貝指針即可,而不用拷貝對象本身,不用擔心會被修改
3. 可以作為HashMap的key,類不可變保證了Hashcode的穩定性。
如果讓你實現一個自定義的class作為HashMap的key該如何實現?
A:主要關注兩點即可
覆寫hashCode以及equals方法應該遵循的原則
實現一個Immutable的類,那么如何實現一個不可變類呢。
1)類需要用final修飾
2)成員變量使用 private final 修飾、對外不提供set方法。
3)如果成員函數使用構造函數去接受外部的數據,成員變量,需要使用接受對象的拷貝(copy)
4)Get方法返回外部接受的成員變量,返回成員變量的拷貝(copy)
package com.jessyframe.learn;
import java.lang.String;
import java.utils.Arrays;
/**
*
* Created by jessy on 2022/12/24.
*/
public final class Immutable {
private final int identity;
private final String value;
private final int[] arr;
public Immutable(int identity, String value, int[] outArr) {
this.identity = identity;
this.value = value;
//this.arr = outArr; //不正確
this.arr = outArr.clone();//使用傳入數組的copy初始化
}
public int[] getArr() {
//return arr; //不正確
return arr.clone(); //返回數組的copy
}
public static void main(String[] args) {
int[] arr = new int[]{12,34};
Immutable im = new Immutable(123,"jessyframe", arr);
int[] arr1 = im.getArr();
Arrays.stream(arr1).forEach((e) -> {System.out.println(e);});
arr[0] = 56;
arr[1] = 78;
Arrays.stream(arr1).forEach((e) -> {System.out.println(e);});
}
}