每次执行for循环,范围内的局部引用类型是一个地址吗?

引言

今天听课的时候发现一个问题

就是有的同学对于字符串在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循环每执行一次,都会重新创建数组对象,自然是重新指向空闲的地址啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值