引言
今天听课的时候发现一个问题
就是有的同学对于字符串在for循环中的引用类型产生了疑问,问是否属于更改?
问题分析
众所周知,字符串类型在Java中属于不可更改的类型
只能重新赋值,而且赋值方式不同导致的内存地址也是不同的
如果出现下面这种情况
for(int i=0;i<3;i++){
String str1 = new String("1");
}
那每次新建的str1
对象是否是还是那个相同的地址呢?
其实在敲出这段代码时,我就已经大致有了猜想,必然是不同的
猜想验证
但是本着实践是检验真理的唯一标准
我用了hashCode
方法打印对象的地址值
for(int i=0;i<3;i++){
String str1 = new String("1");
System.out.println(str1.hashCode());
}
但是我忘记了,String重写了hashCode方法
于是我又去找能打印对象地址的方法
终于找到了它——袪芜存真的方法
for(int i=0;i<3;i++){
String str1 = new String("1");
System.out.println(System.identityHashCode(str1));
}
简单介绍一下,这个是无视重写的hashCode,使用真hashCode的一个方法
结果当然也是和我猜想的一样
for(int i=0;i<3;i++){
String str1 = new String("1");
System.out.println(System.identityHashCode(str1));
System.out.println(str1.hashCode());
}
结果如下
460141958
49
1163157884
49
1956725890
49进程已结束,退出代码为 0
地址果然是不一样的
其实也是很好理解的
for循环每执行一次,都会重新创建数组对象,自然是重新指向空闲的地址啦