定义
所谓的不可变类,意味着,该类持有的内容不可变,如果是复杂类型则引用不可变;如果是基础类型,则值不可变
Integer
比如Integer,那么初始化后,其int值不可变。
private final int value;
value由final修饰,不可变值
由于是final类型,所以即使提供setValue方法,也无法变更value值。
Integer的hashCode方法直接取的value值
String
比如String,初始化后,其char[]引用不可变
private final char value[];
value由final修饰,不可变值
由于是final类型,所以即使提供setValue方法,也无法变更value值。
String a = new String("a"); String b = new String(a); char[] source = {'a','b'}; String d = new String(source);
那么a和b中的char[] value指向同一个字符串常量池中的字符串
那如果是第四行,则d中的char[]与source不是同一个对象。d会创建一个新的char数组。
同时b.toCharArray()与b内部的char数组,以及source三者指向的都不是一个对象
也就是说,不可变类,如果内部是一个数组或者是一个非基本数据类型,那么通过get或其他操作获取其内容时,返回的是一个全新的对象,而不是原对象,因为如果返回源对象,那么就可以进行修改了,就不能叫做不可变类
Boolean
比如Boolean,初始化后,其value值不可变
private final boolean value;
value由final修饰,不可变值
由于是final类型,所以即使提供setValue方法,也无法变更value值。
Boolean的hashcode函数是返回1231或者1237
关于hashcode的实现之为什么选择质数作为扰乱函数的基础
public static int hashCode(boolean value) { return value ? 1231 : 1237; }
它的booleanvalue是把value直接返回,因为value是boolean为基础类型,为值传递。外部变更,不会引起Boolean内部value的变更
public boolean booleanValue() { return value; }
其他的不可变类,比如Long,Double,Float,Character
基本都是一样的道理