HashSet和TreeSet是如何保证元素唯一性的

HashSet和TreeSet是如何保证元素唯一性的

HashSet原理

我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率
较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数。
当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希
值, 然后在集合中查找是否有哈希值相同的对象。
如果没有哈希值相同的对象就直接存入集合,如果有哈希值相同的对象, 就和哈希值相同
的对象逐个进行equals()比较,比较结果为false就存入, true则不存。
将自定义类的对象存入HashSet去重复的关键
类中必须重写hashCode()和equals()方法。
hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储。

TreeSet排序原理总结

1.TreeSet的特点:TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定
的顺序排列。

TreeSet排序方式有两种自然顺序和比较器顺序

1.自然顺序(Comparable):
   TreeSet类的add()方法中会把存入的对象提升为Comparable类型,调用对象的
   compareTo()方法和集合中的对象比较根据compareTo()方法返回的结果进行存储。
2.比较器顺序(Comparator):
   创建TreeSet的时候可以制定 一个Comparator
如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的规则比较
add()方法内部会自动调用Comparator接口中compare()方法排序调用的对象是compare方法
的第一个参数,集合中的对象是compare方法的第二个参数。
3.两种比较方式的区别
   TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)。
   TreeSet如果传入Comparator, 就优先按照Comparator。
发布了25 篇原创文章 · 获赞 3 · 访问量 320

猜你喜欢

转载自blog.csdn.net/weixin_45686974/article/details/103059787