初学Java,比较HashSet,LinkedHashSet,TreeSet,EnumSet(二十七)

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)会报错
}

更方便的一种方法是用foreach,这些都跟C#极为相似.

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

此外, 还有一个copyof方法,可以从Collection集合中创建新EnumSet

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


你可能感兴趣的:(Java)