TreeSet集合知识点总结

TreeSet集合知识点总结

Set集合一大特点是唯一性。

Set集合是如何保证元素的唯一性的?

答:Set集合保证元素唯一性依赖两个方法:hashCode()和equals()。

步骤

   先看hashCode()值是否相同

   相同:继续走equals()方法

   返回true: 说明元素重复,就不添加

   返回false:说明元素不重复,就添加到集合

   不同:就直接把元素添加到集合

 

TreeSet集合两大特点:唯一和排序

TreeSet如何保证元素唯一的?如何实现元素排序的?

答:TreeSet是基于TreeMap实现的,TreeMap集合的底层数据结构是红黑树(一种自平衡的二叉查找树),这就保证了元素的存入和获取都是按照一定顺序进行的。

元素是如何存储进去的呢?

第一个元素存储的时候,直接作为根节点存储

从第二个元素开始,每个元素从根节点开始比较

    大     就作为右孩子

    小     就作为左孩子

    相等     就不搭理它

这就有一个问题,在存储元素的时候,如何判断是大?是小?是相等?

答:TreeSe有两种排序方式:自然排序和比较器排序。至于使用哪种排序方式,由构造方法决定。

自然排序:

  要求创建TreeSet时,使用空参构造,要排序的对象所属的类必须实现Comparable接口,重写compareTo()方法,compareTo()方法,返回一个int类型的值,返回正数代表大,往右放;返回负数,代表小,往左放;返回0,代表相等,不搭理。

  基本数据类型包装类、字符串等类都实现了Comparable接口,重写了compareTo()方法。

String类中compareTo()方法的源码解析:

1、首先获取到两个字符串中长度较小的那个,定义为minLength。

2、将两个字符串转成字符数组
3、根据minLength,遍历两个字符数组中的各个字符,一对一进行比较。如果相等,比较下一对字符;如果不相等,返回两个字符相减后的结果
4、如果在minLength范围内,字符均相等,那么返回两个字符串长度相减后的结果

          正数:大

          负数:小

          0  :相等

比较器排序:

  要求创建TreeSet时,使用有参构造,参数为比较器Comparator(接口)的实现类,要重写compare()方法,compare()方法,返回一个int类型的值,返回正数代表大,往右放;返回负数,代表小,往左放;返回0,代表相等,不搭理。

元素是如何取出来的呢?

  中序遍历取元素。

为什么重写了equals()方法,就必须重写hashCode()方法呢?

答:equals()方法和hashCode()方法都是定义在Object类中的方法,在未被重写时,equals()方法利用==来比较两个对象的内存地址是否相同,调用hashCode()方法返回的是该对象的内存地址。

如果equals()方法返回true,那么两个对象的hashCode()方法返回值必须一样。

假设两个对象,重写了equals()方法,它们相等的条件是内容相等就返回true。如果不重写hashCode()方法,其返回的依然是两个对象的内存地址值,必然不相等。这就出现了equals()相等,hashCode()不相等的情况,违背了hashCode的规则。

猜你喜欢

转载自blog.csdn.net/lz1170063911/article/details/80548296