虽说每个对象的Hash值各不相同,但是每个对象放进HashSet中时,HashSet会先根据放进去的对象的Hash码值给对象分配不同的位置以存储对象,如果存放进来的对象多了,HashSet根据自己特有的散列算法,就有可能把两个不同Hash值的对象分配到同一个位置来存放.但是Set容器又规定,不能存放相同的对象.所以,当HashSet中某一个存放位置A已经存放了一个对象,那么一旦另外有元素放进HashSet中,HashSet通过自己的特有算法,把另一个元素暂时安排在了位置A,由于HashSet中同一个位置不可能放两个元素,所以此时,HashSet就要把暂时安排在位置A的元素与之前已经存放在位置A的元素进行equals比较,如果equals返回true,那么这个暂时安排在位置A的元素就不会被放进HashSet中去了.
所以,只要是用HashSet,HashMap,和HashTable这三种容器来存放对象,就一定要重写hashCode()方法和equals()方法. |