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); } }