今天写代码的时候,遇到一个问题,记下来提醒自己。
本意:循环对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堆上的内存地址,若地址未变而只改变其值,只会保存最后一次的修改值。