Set 体系: 无序,唯一
HashSet: 底层数据结构是哈希表。线程不安全,效率高。
//同一个对象哈希值肯定相同,不同对象哈希值一般不同(比如说:"儿女","农丰"的哈希值就相同)。
// 重地 通话
//HashSet集合存储自定义类型的元素,想保证元素的唯一性,该类必须重写hashCode()和equals()方法。
LinkedHashSet:
是HashSet类的子类,也是Set体系中唯一一个存取一致(有序)的集合。线程不安全,效率高。
HashSet 保证元素唯一性的原理:
HashSet 保证元素的唯一性底层依赖 hashCode()和equals()方法。
判断流程:
// 比较哈希值 && (比较地址值 || 比较属性值)
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { //参考HashMap#put();
//不添加
}
解释:
先比较两个元素的哈希值是否相同,
如果不相同:说明不是同一个对象,就直接添加。
如果相同: 接着比较地址值(这样做是为了提高效率)。
如果相同:肯定是同一个对象,不添加。
如果不同:接着通过equals()方法比较各个属性值。
如果相同:说明是同一个对象,不添加
如果不同:说明不是同一个对象,就添加
|
|