一、HashSet 1、特点: (1)顺序可能与添加的顺序不同 (2)线程是不同步的 (3)元素值可以是null 2、判断两个元素相等的标准是equals()相等,且hashCode()返回值也相等 3、当把某个类的对象保存到HashSet中,重写这个类的hashCode(),equals()方法时,应尽量保证两个对象equals()方法返回true时hashCode()也相等。 4、当把可变对象添加到hashset中后,尽量不要去修改该集合中参与计算的hashCode(),equals()的实例变量,否则会导致HashSet无法正确操作这些元素。
二、LinkedHashSet 1、特点: (1)顺序与添加的顺序相同 (2)性能略低于HashSet,以链表维护顺序
三、TreeSet 1、特点: (1)确保元素处于排序状态,采用红黑树 (2)TreeSet只能添加同一种类型的对象 (3)判断大小的标准compareTo(Object obj)返回0则相等 2、用法
import java.util.TreeSet;3、自然排序,调用compareTo(Object obj)比较大小,升序排列 4、定制排序,如降序排列需在创建TreeSet对象时,提供一个Comparator对象与其关联,如下:
public class TreeSetTest {
public static void main(String[] args) {
//基本用法
TreeSet treeSet=new TreeSet();
treeSet.add(5);
treeSet.add(3);
treeSet.add(-1);
treeSet.add(9);
System.out.println("已经处于排序状态"+treeSet);
System.out.println("第一个元素"+treeSet.first());
System.out.println("小于5的子集,不包含5"+treeSet.headSet(5));
System.out.println(">=5的子集"+treeSet.tailSet(5));
System.out.println("[-1,5]的子集"+treeSet.subSet(-1, 5));
}
}
import java.util.TreeSet;
class M {
int age;
public M(int age) {
this.age = age;
}
public String toString() {
return "M[age:" + age + "]";
}
}
public class TreeSetdingzhi {
public static void main(String[] args) {
// 定制排序
TreeSet treeSet=new TreeSet((o1,o2)->{
M m1=(M)o1;
M m2=(M)o2;
//age越大M越小
return m1.age>m2.age?-1:m1.age<m2.age?1:0;
});
treeSet.add(new M(3));
treeSet.add(new M(12));
treeSet.add(new M(-1));
treeSet.add(new M(-2));
System.out.println(treeSet);
}
}
输出 [M[age:12], M[age:3], M[age:-1], M[age:-2]]
四、EnumSet 1、特点: (1)所有原始是指定枚举类型的枚举值 (2)以枚举值在Enum类的顺序定义元素顺序 (3)不允许null元素 2、用法
import java.util.Collections;输出 [SPRING, SUMMER, FALL, WINTER]
import java.util.EnumSet;
import java.util.SortedSet;
import java.util.TreeSet;
enum Season {
SPRING, SUMMER, FALL, WINTER;
}
public class EnumSetTest {
public static void main(String[] args) {
EnumSet enumSet1 = EnumSet.allOf(Season.class);
System.out.println(enumSet1);
EnumSet enumSet2 = EnumSet.noneOf(Season.class);
System.out.println(enumSet2);
enumSet2.add(Season.WINTER);
enumSet2.add(Season.SPRING);
System.out.println(enumSet2);
EnumSet enumSet3 = EnumSet.of(Season.SUMMER, Season.WINTER);
System.out.println(enumSet3);
}
}
[]
[SPRING, WINTER]
[SUMMER, WINTER]
五、各set性能分析 1、只有需要保持有序采用TreeSet否则要用HashSet 2、EnumSet性能最好,但是只能保存枚举值 3、都是线程不安全的,需要手动保持线程同步
SortedSet set=Collections.synchronizedSortedSet(new TreeSet<>());