50道集合框架面试题 (11)

2)类的所有实例需要遵循与equals()hashCode()相关的规则。请参考之前提到的这些规则。

3)如果一个类没有使用equals(),你不应该在hashCode()中使用它。

4)用户自定义key类的最佳实践是使之为不可变的,这样,hashCode()值可以被缓存起来,拥有更好的性能。不可变的类也可以确保hashCode()equals()在未来不会改变,这样就会解决与可变相关的问题了。

比如,我有一个类MyKey,在HashMap中使用它。

1

2

3

4

5

6

7

 

//传递给MyKeyname参数被用于equals()hashCode()

MyKey key = new MyKey(\'Pankaj\'); //assume hashCode=1234

myHashMap.put(key, \'Value\');

// 以下的代码会改变keyhashCode()equals()

key.setName(\'Amit\'); //assume new hashCode=7890

//下面会返回null,因为HashMap会尝试查找存储同样索引的key,而key已被改变了,匹配失败,返回null

myHashMap.get(new MyKey(\'Pankaj\'));

 

那就是为何StringInteger被作为HashMapkey大量使用。

20.Map接口提供了哪些不同的集合视图?

Map接口提供三个集合视图:

1Set keyset():返回map中包含的所有key的一个Set视图。集合是受map支持的,map的变化会在集合中反映出来,反之亦然。当一个迭代器正在遍历一个集合时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。集合支持通过IteratorRemoveSet.removeremoveAllretainAllclear操作进行元素移除,从map中移除对应的映射。它不支持addaddAll操作。

2Collection values():返回一个map中包含的所有value的一个Collection视图。这个collectionmap支持的,map的变化会在collection中反映出来,反之亦然。当一个迭代器正在遍历一个collection时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。集合支持通过IteratorRemoveSet.removeremoveAllretainAllclear操作进行元素移除,从map中移除对应的映射。它不支持addaddAll操作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzgpxp.html