[英]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.