为什么HashMap中key需要为不可变对象

我们都提倡HashMap中key需要为不可变对象,但是事实上,如果你硬要将HashMap的key为可变对象也是可以的,但是这样会带来很多潜在的危险。

HashMap<List<String>, Object> changeMap = new HashMap<>();
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
Object objectValue = new Object();
changeMap.put(list, objectValue);
System.out.println(changeMap.get(list));
list.add("hello world");
System.out.println(changeMap.get(list));

/*
代码结果:
java.lang.Object@74a14482
null
*/

原因是因为key的hashCode变了。

这是ArrayList的hashCode方法:

/**
 * Returns the hash code value for this list.
 *
 * 

This implementation uses exactly the code that is used to define the * list hash function in the documentation for the {@link List#hashCode} * method. * * @return the hash code value for this list */ public int hashCode() { int hashCode = 1; for (E e : this) hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); return hashCode; }

当增加元素的时候,hashCode也在变化,这样一来,原来的key对应的value就找不到了。

你可能感兴趣的:(Java)