reference所指向的只是GC堆上的内存地址的实操理解

12 篇文章 0 订阅
2 篇文章 0 订阅

今天写代码的时候,遇到一个问题,记下来提醒自己。

 

本意:循环对temp_AddMD5List赋值,并在每次循环中将其值保存在List中

List<Byte> temp_AddMD5List = new ArrayList<Byte>();//申明在循环外

for循环中重复对temp_AddMD5List赋值,最后再将其值添加到另一个List(这里就叫List吧),当然每次循环中间是有调用了

temp_AddMD5List.clear();

问题来了:循环执行完毕后,查看List的内容,发现全部一样,都是最后一次循环temp_AddMD5List的值

个人理解:由于temp_AddMD5List 的初始化是在for循环外,List<Byte> temp_AddMD5List = new ArrayList<Byte>();意思是申明一个List<Byte>类型的引用变量,同时创建一个ArrayList对象,并将引用变量指向新建的ArrayList对象。

for循环,重复对temp_AddMD5List赋值清空,赋值清空,虽然temp_AddMD5List中内容不一样了,但是其所指向的对象始终是同一个(引用变量指向的GC堆上的内存地址没变)。而List中存储的都是temp_AddMD5List所指向的内存地址,而不是实际的数值(因为temp_AddMD5List是引用变量,本身就是类似指针或者指针的指针这样的东西),所以每一次的修改都会连带着之前存储的内容一起修改。

解决:在for循环内部创建new ArrayList<Byte>()对象,这样每次的循环中temp_AddMD5List所指向的对象(也就是GC堆上的内存地址)都是不同的,互不影响。

个人理解,若有哪里不对还望指出来,谢谢。

reference所指向的只是GC堆上的内存地址,若地址未变而只改变其值,只会保存最后一次的修改值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值