HashSet详解
2017-03-09 本文已影响123人
虾菠萝
引用
<blockquote><small>
1.向HashSet<I>集合中加入元素,先调用hashcode(),如果相同再调用equals().通常都要重写<I>类的这两个方法。
2.HashSet 的底层是由 HashMap 实现的,HashSet 存储的值会被当作 HashMap 中的 Key 来存储同时这个 Key 会和一个固定的充当 Value 的值共同组成一个 Entry,这个 Entry 会调用 hashCode()方法计算出一个 hashCode 值作为这个 Entry 的属性。当存入下一个值的时候 HashSet 内部会计算当前存入的值和固定的 Value 值组成的 Entry 的 hashCode 值并和上一个存入值的 hashCode 属性进行比对,如果不同,则存入;如果相同则不存入。如果这时将存入值的 Key 进行修改,然而对应的hashCode属性值却不会因为 Key 值的改变而重新计算,而是会保留开始存入时计算好的 hashCode 值。这时再存入和被修改后相同的 HashSet 值进去的时候,程序会对这个新存入的 HashSet 值和固定的 Value 值组成的 Entry 计算出新的 hashCode 值进和上一个修改后的 Entry 进行比对,然而,上一个存入的值保存了未修改前的 hashCode 值,这时就会出现有相同的值存入 HashSet 的情况。但是这时如果要存入和第二个值修改前相同的值,就会出现不能存入的现象,因为它们会计算出相同的 hashCode 值。
</small></blockquote>