繁体   English   中英

在java中添加后,List的所有元素都是相同的

[英]All element of List is the same after adding in java

由于我的误解,我最近在我的java项目中犯了一个错误。 我有以下代码:

 Post post = new Post(); // Post is my custom class
 List<Post> list = new ArrayList<Post>();
 for( int i = 0; i < num; i++){
      post.setTitle( TITLE[i] ); //TITLE[] is a array of String.
      list.add(post);
 }

之后,List列表中的所有元素都相同,并且等于标题为TITLE [num-1]的帖子。 我知道我对这个问题有误解,因为当我把构造函数放进去的时候

 Post post = new Post();

在循环中,每件事都好。 但有人可以帮我解释一下吗? 非常感谢你。

你刚刚创建了一个Post对象,所以在行中

post.setTitle( TITLE[i] ); //TITLE[] is a array of String.
list.add(post);

您只是更改该Post的标题并将其添加到list 最后, list只有一个 Post ,但多次。

为什么? 因为事实上,对象是对内存中位置的引用,因此您在每次迭代时添加相同的引用(相同位置)。

你怎么解决它? 您可以在每次迭代时创建一个新对象:

for( int i = 0; i < num; i++){
    Post post = new Post();
    post.setTitle( TITLE[i] );
    list.add(post);
}

你有一个单一的帖子。 在你的循环中,你一遍又一遍地设置同一个Post的名字,然后将它添加到List中。 List的每个元素都指向Post的同一个实例,你已经重命名了很多次。

将Post post = new Post()行放在循环中会创建一个Post的实例,为其指定一个名称,并将该实例添加到List中。 现在,List的每个索引都指向Post的不同实例,每个实例都有不同的名称。

以这种方式思考:假装你有一只名叫宾果的狗。 你拍了一张狗的照片,然后将那张照片添加到相册中。 然后你将那条狗改名为Fido。 您拍摄同一只狗的另一张照片,然后将该照片添加到相册中。 重复此过程100次。 你有100张不同名字的狗的照片吗? 或者你有100张相同狗的照片,你最后给出的是什么名字?

推荐阅读: http//www.javaranch.com/campfire/StoryCups.jsp及其后续行动: http//www.javaranch.com/campfire/StoryPassBy.jsp

post是对象Post一个实例。

你在post.setTitle(...)中做的是修改post并在列表中存储对它的引用。 列表中的所有元素都是对同一Post对象的引用,因此如果您修改它,则列表中的所有元素都将更改。

如果要存储不同的Post项,则需要每次都创建不同的Post项。

把一个班级想象成一个饼干切割器和记忆作为面团。 每次调用构造函数时,都会将一些内存压缩成形状。 这是一个对象实例。

如果只调用一次构造函数,则只有一个对象实例。 每次循环时,都会在集合中放置一个指向该实例的指针。 在循环结束时,您拥有指向同一对象实例的所有指针。

将构造函数移动到循环中时,每次循环时,都会创建一个新的对象实例。 您在列表中存储指向该实例的指针。 现在,在循环结束时,列表中的每个指针都有一个对象实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM