序言:
基本类型在集合中可以直接使用,当我使用自己定以的类型时,在set中需要一种方式来维护存储顺序,而set不同的 实现直接方式也是不同的。
一、set集合
set中的元素是不能重复的,因此加入set的元素必须定以equals方法(引用类型必须重写equals和hashcode),同时set中的不保证维护元素的次序。
1.HashSet:
** 特点:**<br /> ①:查找元素快,存入其中的元素必须定以HashCode方法;
2.TreeSet:
** 特点:**<br /> ①:能够保存元素的次序,底层为树结构(红黑树)。<br /> <br /> ②:可以从set中提取有序的元素,所以元素必须要实现comparable接口。③:不需要重写hashCode()和equals()方法,去重是依靠比较器来去重
因为结构是红黑树,所以每次插入都会遍历比较来寻找节点插入位置,如果发现某个节点的值是 一样的那就会直接覆盖。
** 示例:**
public class Persons implements Comparable<Persons>{private String name;private Integer age;Persons(){}Persons(String name,Integer age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Persons{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Persons o) {return age<o.age?1:(age>o.age?-1:0);}}class PresonsTest{public static void main(String[] args) {Set<Persons> set = new TreeSet<>();Persons persons = new Persons("aaa",12);Persons persons2 = new Persons("ccc",15);Persons persons3 = new Persons("aaa",12);Persons persons4= new Persons("ddd",10);Persons persons5= new Persons("ddd",16);Persons persons6= new Persons("ddd",18);set.addAll(Arrays.asList(persons,persons2,persons4,persons3,persons6,persons5));System.out.println(set);System.out.println(set.contains(persons3));//contains(persons3)也依靠比较器}}
3. LInkedHashSet:
**特点:**<br /> ①:既有HashSet的查询速度,同时因为内部是链表存储机构,所以以插入的顺序维护元素,<br /> ②:使用迭代器遍历的时候会安装元素的插入顺序显示。<br /> ③:存入其中的元素也必须要定义hashCode()方法。
二、SortedSet:
SortedSet中的元素可以保证处于排序状态提供的功能有:<br /> ①:**Comparator comparator** 方法,返回set集合使用的comparator,如果返回null,则表示自然排序<br /> ②: <br /><br /> 示例
public class SortedSetDemo {public static void main(String[] args) {final SortedSet<String> sortedSet = new TreeSet<>();Collections.addAll(sortedSet, "one two three four five six seven eight".split(" "));System.out.println(sortedSet);String first = sortedSet.first();System.out.println(first);String last = sortedSet.last();System.out.println(last);final Iterator<String> iterator = sortedSet.iterator();for (int i = 0; i <=6 ; i++) {if (i==3) {first= iterator.next();System.out.println("i==3"+first);}else if (i==6) {System.out.println("i==6"+iterator.next());}else {System.out.println("其他时候" + iterator.next());}}System.out.println(sortedSet.subSet(first, last));System.out.println(sortedSet.headSet(last));System.out.println(sortedSet.tailSet(last));}}
注意:SortedSet的意思是按对象的比较函数进行元素排序。
