黑马程序员技术交流社区

标题: 关于Collection.fill()方法覆盖集合部分元素的问题 [打印本页]

作者: 高波    时间: 2013-5-24 16:50
标题: 关于Collection.fill()方法覆盖集合部分元素的问题
本帖最后由 高波 于 2013-5-25 12:51 编辑

Question:
取出集合al的子集合subal,通过答应哈希值,发现哈希值不同,说明他们在内存中是两个独立的对象,当我调用subal的Collection.fill方法后,为什么原集合中的元素(subal部分)也跟着改变了?
  1. import java.util.*;

  2. class Test {
  3.         public static void main(String[] args) {
  4.                 List<String> al = new ArrayList<String>();
  5.                 al.add("abc01");
  6.                 al.add("abc03");
  7.                 al.add("abc08");
  8.                 al.add("abc06");
  9.                 al.add("abc05");
  10.                 al.add("abc02");
  11.                 al.add("abc07");
  12.                 fillMethod(al, 3, 5);

  13.         }

  14.         public static void fillMethod(List<String> al, int start, int end) {
  15.                 sop(al);
  16.                 List<String> subal = al.subList(start, end);
  17.                 Collections.fill(subal, "pp");
  18.                 sop(subal);
  19.                 sop(al);
  20.                 sop(subal.hashCode());
  21.                 sop(al.hashCode());
  22.         }

  23.         public static void sop(Object obj) {
  24.                 System.out.println(obj);
  25.         }
  26. }
复制代码

作者: 徐启坤    时间: 2013-5-24 16:56
列表也是引用型变量,subal和al是两个不同的引用,所以哈希值不同
但是subal指向的列表是al指向的列表的一部分,所以指向的是相同的列表元素
你改变了subal指向的元素,就相当于把al指向的元素也改变了
作者: 刘胜寒    时间: 2013-5-24 20:39
这是list集合。。。。。
我都无语了。。。。

作者: 刘胜寒    时间: 2013-5-24 20:43
哥们咋一看,还你为你是用hashSet呢。。。
作者: 高波    时间: 2013-5-25 08:23
刘胜寒 发表于 2013-5-24 20:43
哥们咋一看,还你为你是用hashSet呢。。。

大哥,啥意思啊,木有明白啊。。。




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