想一想,为什么我们在HashMap放key的时候经常使用String或者Integer呢?A:String和Integer都是final-modified,他们很好地重写了hashCode和equals方法。最重要的是它们是Immutableclasses,也就是不可变的类。可以保证hashCode的稳定性。不可变类的优点和用途1.线程安全,无需加锁,因为对象的内容是不可变的,所以不用担心线程同时修改对象2.拷贝效率高。当类不可变时,只需要复制指针就可以复制它的对象,而不是复制对象本身,不用担心被修改。3、可以作为HashMap的key,不可变类保证了Hashcode的稳定性。如何实现一个自定义类作为HashMap的key?A:主要关注两点重写hashCode和equals方法实现Immutable类应该遵循的原则,那么如何实现一个immutable类。1)类需要用final修饰2)成员变量用privatefinal修饰,对外不提供set方法。3)如果成员函数使用构造函数接受外部数据和成员变量,需要使用接受对象的副本。4)Get方法返回外部接受的成员变量,返回成员变量的拷贝(copy)包com.jessyframe。learn;importjava.lang.String;importjava.utils.Arrays;/****jessy于2022/12/24创建。*/publicfinalclassImmutable{privatefinalintidentity;私有最终字符串值;私人最终int[]arr;publicImmutable(intidentity,Stringvalue,int[]outArr){this.identity=identity;this.value=值;//this.arr=outArr;//不正确this.arr=outArr.clone();//用传入数组的副本初始化}publicint[]getArr(){//returnarr;//不正确的返回arr.clone();//返回数组的副本}publicstaticvoidmain(String[]args){int[]arr=newint[]{12,34};不可变im=newImmutable(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);});}}
