TreeSet:
TreeSet集合开发中没怎么用到。此处既然学习到了就记录下来一遍大家一起学习讨论。
首先TreeSet集合是Set接口的实现类。TreeSet集合的元素不能重复。
需要加入TreeSet集合的类必须实现Comparable接口并重写compareTo方法,否则回报ClassCastException
TreeSet中加入的对象,如果equals和compareTo方法都判断为同一个对象的话,只会存储一个元素。重复的元素不会存储,而且不会报错。
因为TreeSet中的元素默认会对元素进行排序
所以TreeSet在添加元素的时候会做相应的的处理
TreeSet集合的排序方式有两种:自然排序,定制排序
自然排序:集合元素对象的实现类需要实现Comparable接口,并重写compareTo方法。默认是升序的。
定制排序:创建TreeSet对象时,提供Comparator对象与TreeSet集合关联。有Comparator负责元素排序。
============================================================
由于TreeSet集合元素是不可重复的,当equals返回true,compareTo方法返回0时。是不会添加进集合的。
注意:equals方法和compareTo方法的返回结果必须一致!即equals方法返回true,compareTo方法返回 0 ,否则会出现一下这种混乱的情况
当equals返回false,comparaTo方法返回0时,TreeSet分配两个不同的地址存放该对象。
当equals返回true,comparaTo方法返回1时,TreeSet会将两个对象保存在一个位置。
当存入TreeSet集合中的对象是可变对象的时候,如果可变对象发生改变,会产生混乱的情况,比如删除元素删除掉之类的。所以强烈推荐HashSet和TreeSet中的元素传入不可变对象,来确保不出意外!
hashSet
而hashSet总是比treeSet在性能方面优越(特别是最常用的添加,查询等操作),因为TreeSet需要使用红黑树算法来维护元素的次序。
所以当不需要对元素进行排序的时候应选用hashSet集合。
还有Set集合的三个实现类:hashSet、TreeSet、和EnumSet都不是线程安全的,所以当多个线程需要访问集合的时候,需要手动加锁。