我们都知道Java中的String类型对象是不变对象。也就是一旦创建了对象,就不能再改变其内容。到底不变量是怎么一回事儿,有些童鞋还存在疑惑。比如说,String s = "hello world"; s="happy new year"; 字符串的值不是由"hello world" 变成"happy new year"了么,怎么说它是不变量呢?
实际上“不变对象”指的是对象本身不可改变内容。这里s是指向字符串的引用,本身不是对象。s可以此时指向这个对象,彼时指向另外一个对象。而“hello world”和"happy new year"都是字符串对象。它们存储在内存空间的某处,它们一旦创建了,其内容便不可再改变。执行String s = "hello world"; s="happy new year";两句过程如下图1所示,虚线表示s初始时指向“hellw word”对象,实线表示后来指向 “happy new year”对象。 而不是如图2所示过程,s所指对象不变,对象本身内容变成了“happy new year”。
System.identifyHashCode() 方法返回Object的HashCode,即未被重写的原始hashCode,可以用来查看对象地址。
下面的程序可以验证一下。
public class StringFinalTest {
public static void main(String[] args){
String s1 = "hello world";
String s2 = "hello world"; //两个字符串相等,实际上s1和s2指向同一个对象
System.out.println(System.identityHashCode(s1)); //这里打印出的s1和s2的地址是一样的
System.out.println(System.identityHashCode(s2));
s2 = "happy new year"; //s2重新赋值,实际上是抛弃老对象,重新创建一个新对象。从对象的地址可以看出
System.out.println(System.identityHashCode(s2));//这里打印的地址和原来的s2地址不一样了
}
}
程序运行结果如下:
491044090
491044090
644117698