A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘笑 中级黑马   /  2012-6-27 18:31  /  1795 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘笑 于 2012-6-28 13:47 编辑

public class ListTest {
public static void main(String[] args) {
List<CoreSltoRecord> list = new ArrayList<CoreSltoRecord>();
CoreSltoRecord c = new CoreSltoRecord();
c.setIsvalid((short)1);
list.add(c);

List<CoreSltoRecord> listall = new ArrayList<CoreSltoRecord>();
listall.addAll(list);
for(CoreSltoRecord r : list){
r.setIsvalid((short)2);
}
// for(CoreSltoRecord r : listall){
// r.setIsvalid((short)2);
// }
System.out.println(list.get(0).getIsvalid());
System.out.println(listall.get(0).getIsvalid());
}
}
为什么输出的值都是2呢???

3 个回复

正序浏览
本帖最后由 吴小东 于 2012-6-28 12:38 编辑

public class ListTest {
public static void main(String[] args) {
List<CoreSltoRecord> list = new ArrayList<CoreSltoRecord>();     --> 创建集合  list
CoreSltoRecord c = new CoreSltoRecord();                                   --> 创建对象 c   
c.setIsvalid((short)1);                                                                    -->设置对象属性
list.add(c);                                                                                      -->将对象c 添加到 list

List<CoreSltoRecord> listall = new ArrayList<CoreSltoRecord>();  -->创建集合 listall
listall.addAll(list);                                                                              -->将集合list中的元素添加到 listall 也即是现在 集合list 和 listall 分别指向两个不同的内存地址,
                                                                                                           但是存放在集合中的元素都是指向同一个或者一组(如果添加的是多个元素的话)对象
for(CoreSltoRecord r : list){                                                            -->遍历集合 listall 也就是对集合中的元素进行遍历,下面一句改变属性值
r.setIsvalid((short)2);
}
// for(CoreSltoRecord r : listall){                                                       -->就算是遍历这个集合也是一样的效果
// r.setIsvalid((short)2);
// }
System.out.println(list.get(0).getIsvalid());                                      -->这两个打印,虽然集合的指向不同,但是两个集合中的元素确实指向同一个,
                                                                                                          所以这两句打印都是同一个对象C  
                           
System.out.println(listall.get(0).getIsvalid());
}

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1 赞一个!

查看全部评分

回复 使用道具 举报
哥们我想问一下你代码截全了吗?
回复 使用道具 举报
链表中存的是对象的引用。意思是存的是指向某个内存的地址的指针(可以这么理解)。第一个链表更改了内存内的值,第二个链表取对应内存的值也是改变的。不知道能不能解决你的疑问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马