浅谈List保存的数据是引用数据类型的地址

浅谈List保存的数据是引用数据类型的地址

今天一个初学javaweb的朋友问我一个bug,经过和别人 讨论分析了解到List对象细节上的一些问题,我将代码重新简化构造了一下做成了一个例子。上代码:

浅谈List保存的数据是引用数据类型的地址

得到的结果:

浅谈List保存的数据是引用数据类型的地址

咋一看,无非就是第一个循环没有循环创建test对象,第二个循环创建了test对象。

按照逻辑test在循环数据都进行了更新,然后再加入到list对象的,若不考虑list引用数据类型地址问题,第一个print和第二个print会都会输出[0,1,2,3,4]。

事实上,这和list引用数据类型地址有关,由于list存放的是一个对象的地址,而不是这个对象的值,所以当对象更新之后,之前加入list对象的test的值会因为test的对象更新,但对象地址没有发生变化,所以当list遍历的时候,由于是存放的地址,我们会取到同一个test对象,而对象的值也更新成了最后一个循环所赋的值。

简单的说:第一个:list里面存的是 【地址4,地址4,地址4,地址4】list并不是存的 【值1,值2,值3,值4.....】

                  第二个:list里面存的是 【地址1,地址2,地址3,地址4】而我们往往需要的是结果二,而不是结果一。