Set集合类常用的API
JDKAPI中所提供的Set集合类常用的有:
HashSet:散列存放**
TreeSet:有序存放**
LinkedHashSet: 有次序
1. HashSet
众所周知,HashMap是Key-Value的形式存储存储的。而HashSet是基于HashMap实现的。
它是一个默认构造方法是构建一个初始容量为16,负载因子为0.75 的HashMap。
是封装一个HashMap对象来存储集合的。
集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
想要存放对象元素进HashSet,我们需要重写该类的equals(Object obj)方法和 hashCode() 方法;
而且这两个方法的返回值必须保持一致:当该类的两个的 hashCode() 返回值相同时,它们通过 equals() 方法比>较也应该返回true。
正常使用,操作方法都是基于HashMap
Set set = new HashSet();
set.add("b");
set.add("g");
set.add("d");
set.add("a");et.add("c");
set.add("f");
System.out.println("set 集合:" + set);
set.remove("a");
System.out.println("set 集合:" + set);
可以看得出,我们存储进去的顺序跟取出的顺序不一样,提现出它的无序性。
再来看:
Set set = new HashSet();
set.add("b");
set.add("b");
set.add("b");
set.add("b");
set.add("b");
System.out.println("set 集合:" + set);
明明。我已经Add了5个 “b” 进HashSet,为什么打印出来只有一个?因为Set的集合的特点就是元素是唯一的。
2. TreeSet
TreeSet使用红黑树结构对加入的元素进行排序存放,所以放入TreeSet中元素必须是可排序 的。
TreeSet的两种排序方式:
1.自然排序(默认)
2.定制排序
自然排序
TreeSet调用调用集合元素的CompareTo()方法,根据该方法的返回值来比较元素之间的大小,然后进行“升序”排列,这种排序方式我们称之为自然排列。
如果想采用自然排序,则要存储的对象所属类必须实现Comparable 接口。该接口只有一个方法public int compareTo(Object obj),必须实现该方法。
compareTo方法的实现规则:
返回 0,表示 this == obj。//则不会添加新对象
返回正数,表示 this> obj //添加到原来对象的右边
返回负数,表示 this < obj // 添加到原来对的左边
定制排序
使用Comparable接口定义排序顺序有局限性:实现此接口的类只能按compareTo()定义的这一种方式排序。
如果需要更加灵活地排序,我们可以自定义(Comparator)比较器,在创建TreeSet集合对象时把我们自定义的比较器传入,则可以TreeSet会按照我们的比较器中定义的规则进行排序。
自定义比较器类,需要实现Comparator接口。Comparator接口只有一个抽象方法需要实现:public int compare(Object a, Object b);
判断规则:
返回 0,表示a == b
返回正数,表示b > b
返回负数,表示a < b
3. LinkedHashSet
LinkedHashSet根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。
LinkedHashSet的方法与它父类HashSet方法是一样的
如果我们需要迭代的顺序为插入顺序或者访问顺序,并且保证元素存储的唯一.
LinkedHashSet 是首选。