黑马程序员技术交流社区

标题: 关于List中元素的修改的问题,一点小疑惑。 [打印本页]

作者: 黄昆    时间: 2012-7-14 12:54
标题: 关于List中元素的修改的问题,一点小疑惑。
首先List<Person>list = new ArrayList<Person>();
然后Person p = new Person();
list.add(p);
当我们对p进行修改后再次,再次从list把这个p取出来,我们得到的这个p是修改前的还是修改后的?
作者: 丁二跃    时间: 2012-7-14 13:22
当然是修改后的:
list.add(p)  只是把 p 的 值,也就是 p指向的 Person 的对象实例的引用地址 存储在 list 内。
p 和 list.get(index)  指向的是一样的
作者: dev    时间: 2012-7-14 13:24
本帖最后由 翁游龙 于 2012-7-14 13:25 编辑

当把p添加到list之后,再次对p进行修改,取出来的是修改后的内容
因为引用p指向了在内存空间的Person的成员,不管你对p怎么修改,
list获得的数据都是最新的。看看以下程序你就应该明白了:
  1. import java.util.*;
  2. public class TestList
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 List<Person> list = new ArrayList<Person>();
  7.                 Person p = new Person("张三");
  8.                 list.add(p);
  9.                 System.out.println(list);  //打印张三

  10.                 p.setName("李四");
  11.                 System.out.println(list);  //修改后打印李四
  12.         }
  13. }

  14. class Person{
  15.         private String name;
  16.         Person(String name){
  17.                 this.name = name;
  18.         }
  19.         public void setName(String name){
  20.                 this.name = name;
  21.         }
  22.         public String getName(){
  23.                 return this.name;
  24.         }
  25.         public String toString(){
  26.                 return "name="+this.name;
  27.         }
  28. }
复制代码

作者: 刘煜    时间: 2012-7-14 13:25
本帖最后由 刘煜 于 2012-7-14 14:07 编辑

是修改后的内容。ArrayList的底层数据结构是数组,它存放的是元素的地址。ArrayList的元素有角标,对元素的操作本质上跟数组的一样。list.add(p)是将Person对象p的地址存入了数组,p一旦被初始化后他的地址就不会改变了,并在内存中开辟一段空间用于存放自己内部的数据。当你修改了p对象内部的内容时,只是修改p内部存放的内容,并没有修改p的地址,list存放的地址也没变,当你从list中读取p的时候,系统会去读取list中存储的指向对象p的那段地址空间里的内容,即p对象修改后的内容。也就是说还是p对象那段内存空间,只是里边的内容变了,所以读取p的时候是修改后的内容
作者: 王宝康    时间: 2012-7-14 13:49
List属于java集合,Java集合中不能存放基本类型数据,只能存放对象的引用,即对象在内存中的地址,你把某个对象的引用存放到List中,相当于你把某街道某栋楼某房间号(比如说,海淀区上地环岛东金隅嘉华E座2层301)告诉了快递员,快递员会记住这个地址,而这个在地址办公的人或单位走了以后,这个地址还是有效的,然后快递员再来这个地址就会跟新来的办公的人接触,打交道。
作者: 王宝康    时间: 2012-7-14 13:53
标题: RE: list.add(p)是将Person对象p的地址存入了数组
刘煜 发表于 2012-7-14 13:25
是修改后的内容。因为定义数组相当于系统定义了内存里一段连续的地址空间,数组存放的是元素的地址。list.a ...

“list.add(p)是将Person对象p的地址存入了数组”,所有Java集合类都位于java.util包中。与Java数组不同,Java集合中不能存放基本类型数据,而只能存放对象的引用,这里的List是Java集合,可不是数组啊!
作者: 刘煜    时间: 2012-7-14 14:00
王宝康 发表于 2012-7-14 13:53
“list.add(p)是将Person对象p的地址存入了数组”,所有Java集合类都位于java.util包中。与Java数组不同 ...

ArrayList 的底层数据结构就是数组啊~~ArrayList存放的也是元素的地址,它也有角标,你操作list本质跟操作数组类似的
作者: 王宝康    时间: 2012-7-14 14:10
刘煜 发表于 2012-7-14 14:00
ArrayList 的底层数据结构就是数组啊~~ArrayList存放的也是元素的地址,它也有角标,你操作list本质跟操 ...

哈哈...学习了,谢谢...
ArrayList
(1) 概述:ArrayList底层是用数组实现的,是一个可变数组,是有序的数据结构,可以存放重复的元素。其用法与LinkedList类似。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率
作者: 刘煜    时间: 2012-7-14 14:21
王宝康 发表于 2012-7-14 14:10
哈哈...学习了,谢谢...
ArrayList
(1) 概述:ArrayList底层是用数组实现的,是一个可变数组,是有序的 ...

:)大家都继续加油~~技术分啊~~嘿嘿





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2