本帖最后由 李龙276596456 于 2012-8-7 09:37 编辑
好吧,我逐句解释下吧:
首先:Person per=new Person(13,"张三");
m.put(per,"1");
System.out.println(m.get(per)); 打印出 1
应该好理解,没什么解释的,
然后System.out.println(m.get(new Person(13,"张三")));
上面回复提到的源码的这行:if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
hash值和现在new Person(13,"张三")计算出来的hash值是一样的,key.equals(k) 因为重写了equals方法,所以也是相等的,所以也打印出1
接着per.setAge(14);
System.out.println(m.get(per));
这时,per里的年龄改变了,但是在hashmap里面,hash 属性为Entry<K,V>里的一个final int hash 属性 ,意思就是在你PUT时,放进去的时候,元素的hash值已经被记录了,而且不会再被改变,还是这行代码if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
e.hash 还是年龄为13时的hash值,不会发生改变,但是per修改完年龄再计算出来的hash值“hash ”是14岁的hash值,和13岁的hash值是不同的,即
e.hash != hash 所以取出值是null,打印出的也是null,
接着
System.out.println(m.get(new Person(13,"张三")));
还是那行代码if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
都是13岁的hash值,所以e.hash == hash 但是这时的per年龄是14岁的,new Person(13,"张三") 年龄是13岁的,
所以key.equals(k)返回是false,所以取不到值,所以打印还是null,
接着
System.out.println(m.get(new Person(14,"张三")));
还是那行代码if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
e.hash还是13岁的hash值,但new Person(14,"张三") 的是14岁的hash值,
所以e.hash != hash ,还是取不到值,还是打印null,
希望我的解释能有所帮助 |