@Test
public void testObject() {
ArrayList list = new ArrayList();
System.out.println("a : " + list.hashCode());
changeObject(list);
System.out.println("d : " + list.hashCode());
}

public void changeObject(ArrayList list) {
System.out.println("b : " + list.hashCode());
list.add("1");
System.out.println("c : " + list.hashCode());
}
结果是:
a : 1
b : 1
c : 80
d : 80无法理解输出,求大侠指点!

解决方案 »

  1.   

    hashcode一般用在hash表中
    建议lz看看这个blog,我觉得写的不错。http://www.blogjava.net/ycfdonews/articles/168476.html
      

  2.   

    谢谢yangting_lisa,这篇文章使我受益,不过我主要想问list.add("1")之后,为什么list的地址变了,而d的地址也随着变?
      

  3.   

    hashcode 是物理地址的引用,当你add()的时候,物理存储空间就大了,所以地址也变化了
      

  4.   

    楼上正解,LZ当你在list中ADD一个对象,这对象就要分配内存,所以就会变,不要太纠结这样的问题~~~
    而如果你引用地址,那就只是引用一下该地址里存放的数值,所以地址不会改变的~~但值可以改变。
    希望有帮助~~
      

  5.   

    Java的世界里面哪来的物理地址这一说?就是C++的普通程序都碰不到。
      

  6.   

    回复healer_kx,java物理地址既对象的内存地址,内存其实某种意义上说也是物理的,我的理解,不过这不是问题的重点,我无法理解为什么有c和d两个输出
      

  7.   

    如果 你list.get(0).hashcode() 输出还是1,你想想 数组的引用 
    int【】 a=new int【】{1,2},a【0】是引用一个地址,a【2】是一个地址,当你要表示数组a的时候,肯定不能和a【0】一样
      

  8.   

    谢谢诸位,我基本知道了,list只是一个对象的引用,和list.hashCode()没有必然联系,只要保存引用就不会错,hashCode()可能随时改变,结贴。
      

  9.   

    首先,ArrayList对象是引用类型,在执行add之前,不管是实参还是形参,它们指的都是同一个对象;所以,在执行add之前,a和b指的都是list对象在栈中的地址,执行之后,c和d指的也都是改变后的栈中地址
      

  10.   

      System.out.println("a : " + list.hashCode());输出 a:1的原因是,jdk 提供的hashCode源码如下:
            public int hashCode() {
    int hashCode = 1;
    Iterator<E> i = iterator();//得到迭代器
    while (i.hasNext()) {
        E obj = i.next();
        hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
    }
    return hashCode;
        }
            由于初始的list里面没有值,所以不会执行while循环,自然输出结果就为1;changeObject(list);
    在该方法中, System.out.println("b : " + list.hashCode());执行的时候同样没有改变list,所以会输出b:1;当执行add方法时,为list添加一个对象,此时while循环将会执行,此时的hashCode值为,31*1+“1”.hashCode;对于后面的“1”.hashCode要用String的hashCode方法进行计算,因为String类重载了hashCode方法,计算的结果为49(可以看看String源码就一目了然),所以最终的输出结果为c :80;
    最后的输入,你应该明白了吧。有时候问题的解决方法都可以从java提供的API源码中找到答案,希望对你有所帮助……