HashSet 集合存入元素时,会调用该对象的hashCode()方法得到hashCode值,根据hashCode值决定对象在HashSet中存储的位置,如有两个元素通过equals方法比较返回true,但它们的hashCode不同,HashSet会把它们存储在不同位置,也就可以添加成功
迭代HashSet没什么好说的,可以用Iterator接口
Iterator it = hashSet1.iterator();
while(it.hasNext())
{
String book = (String)it.next();
//从集合中删除上一次next方法返回的元素
it.remove(); //这里只能用迭代器删除元素,不能用集合自身的方法,如hashSet1.remove(book)会报错
}
LinkHashSet 比HashSet 多了一个插入元素时维护元素次序的链表,这样使得元素看起来是以插入的顺序保存,也就是说在遍历LinkHashSet时,将会按元素添加的顺序访问集合里的元素,因此它在插入元素时性能比HashSet略低,但在遍历时性能比HashSet高,因为它以链表来维护内部顺序。
TreeSet是SortedSet接口的唯一实现,可以确保元素处于排序状态,另外它还提供了几个HashSet没有的方法
first() 返回集合中第一个元素
last() 返回集合中最后一个元素
lower(Object e) 返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参考元素不需要是TreeSet中的元素)
higer(Object e) 跟lower方法相反
subSet(fromElement,toElement) 返回此Set子集,范围从fromElement(包含)到toElement(不包含)
headSet(toElement) 返回此Set子集,由小于toElement的元素组成
tailSet(fromElement) 返回此Set子集,由大于或等于fromElement的元素组成
import java.util.*;
public class TestTreeSetCommon
{
public static void main(String[] args)
{
TreeSet nums = new TreeSet();
//向TreeSet中添加四个Interger对象
nums.add(5);
nums.add(2);
nums.add(10);
nums.add(-9);
//输出集合元素,看到集合元素已经处于排序状态
System.out.println(nums);
//输出集合里的第一个元素
System.out.println(nums.first());
//输出集合里的最后一个元素
System.out.println(nums.last());
//返回小于4的子集, 不包含4
System.out.println(nums.headSet(4));
//返回大于5的子集,如果Set中包含5,子集中还包含5
System.out.println(nums.tailSet(5));
//返回大于等于-3,小于4的子集
System.out.println(nums.subSet(-3,4));
}
}
EnumSet是一个专门为枚举类设计的集合类,其中所有元素都必须是指定枚举类型的枚举值,该枚举值类型在创建EnumSet时显式或隐式地指定。其集合元素也是有序的,其以枚举值在Enum类内定义的顺序来决定集合元素的顺序。
public enum Season
{
SPRING,SUMMER,FALL,WINTER
}
import java.util.*;
public class EnumSetDemo
{
public static void main(String[] args)
{
//创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值
EnumSet es1 = EnumSet.allOf(Season.class);
//输出[SPRING,SUMMER,FALL,WINTER]
System.out.println(es1);
//创建一个EnumSet空集合,指定其集合元素是Season类类型的枚举值
EnumSet es2 = EnumSet.noneOf(Season.class);
//输出[]
System.out.println(es2);
//手动添加两个元素
es2.add(Season.WINTER);
es2.add(Season.SPRING);
//输出[SPRING,WINTER]
System.out.println(es2);
//以指定枚举值创建EnumSet集合
EnumSet es3 = EnumSet.of(Season.SUMMER,Season.WINTER);
//输出[SUMMER,WINTER]
System.out.println(es3);
EnumSet es4 = EnumSet.range(Season.SUMMER,Season.WINTER);
//输出[SUMMER,FALL,WINTER]
System.out.println(es4);
//新创建的EnumSet集合的元素和es4的元素有相同的类型,
//es5的集合元素 + es4的集合元素 = Season枚举类的全部枚举值
EnumSet es5 = EnumSet.complementOf(es4);
//输出[SPRING]
System.out.println(es5);
}
}
import java.util.*;
public class TestEnumSet
{
public static void main(String[] args)
{
Collection c = new HashSet();
c.clear();
c.add(Season.FALL);
c.add(Season.SPRING);
//复制Collecgtion集合中的所有元素来创建EnumSet集合
EnumSet enumSet = EnumSet.copyOf(c);
//输出[SPRING,FALL]
System.out.println(enumSet);
c.add("Struct2");
c.add("J2EE");
//下面的代码出现异常,因为c集合里面不是全部元素都是枚举类型
enumSet = EnumSet.copyOf(c);
}
}