HashSet、LinkedHashSet和TreeSet

  1. 关键技术:  
  2.   
  3.     HashSet采用散列函数对元素进行排序,是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode方法。  
  4.     TreeSet采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序(升序或者降序)的序列。需要注意的是,存入自定义类时,TreeSet需要维护元素的存储顺序,因此自定义类要实现Comparable接口并定义compareTo方法。  
  5.     LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。  
关键技术:

    HashSet采用散列函数对元素进行排序,是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode方法。
    TreeSet采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序(升序或者降序)的序列。需要注意的是,存入自定义类时,TreeSet需要维护元素的存储顺序,因此自定义类要实现Comparable接口并定义compareTo方法。
    LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。
  1. package book.arrayset;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashSet;  
  5. import java.util.Iterator;  
  6. import java.util.LinkedHashSet;  
  7. import java.util.List;  
  8. import java.util.Set;  
  9. import java.util.TreeSet;  
  10.   
  11. /** 
  12.  * 演示各种Set的使用 
  13.  * 存入Set的每个元素必须是唯一的,因为Set不保存重复元素。 
  14.  */  
  15. public class TestSet {  
  16.   
  17.     /** 
  18.      * 初始化Set的元素 
  19.      * @param set 
  20.      */  
  21.     public static void init(Set set){  
  22.         if (set != null){  
  23.             set.add("aaa");  
  24.             set.add("ccc");  
  25.             set.add("bbb");  
  26.             set.add("eee");  
  27.             set.add("ddd");  
  28.         }  
  29.     }  
  30.     /** 
  31.      * 输出set的元素 
  32.      * @param set 
  33.      */  
  34.     public static void output(Set set){  
  35.         if (set != null){  
  36.             //使用迭代器遍历Set,也只有这一种方法  
  37.             Iterator it = set.iterator();  
  38.             while (it.hasNext()){  
  39.                 System.out.print(it.next() + " ");  
  40.             }  
  41.         }  
  42.         System.out.println();  
  43.     }  
  44.     /** 
  45.      * 使用HashSet 
  46.      */  
  47.     public static void testHashSet(){  
  48.         Set mySet = new HashSet();  
  49.         init(mySet);  
  50.         System.out.println("使用HashSet: ");  
  51.         output(mySet);  
  52.     }  
  53.     /** 
  54.      * 使用TreeSet 
  55.      */  
  56.     public static void testTreeSet(){  
  57.         Set mySet = new TreeSet();  
  58.         init(mySet);  
  59.         System.out.println("使用TreeSet: ");  
  60.         output(mySet);  
  61.     }  
  62.     /** 
  63.      * 使用LinkedHashSet 
  64.      */  
  65.     public static void testLinkedHashSet(){  
  66.         Set mySet = new LinkedHashSet();  
  67.         init(mySet);  
  68.         System.out.println("使用LinkedHashSet: ");  
  69.         output(mySet);  
  70.     }  
  71.     public static void main(String[] args) {  
  72.         TestSet.testHashSet();  
  73.         TestSet.testTreeSet();  
  74.         TestSet.testLinkedHashSet();  
  75.           
  76.         Set mySet = new HashSet();  
  77.         init(mySet);  
  78.         //Set不允许元素重复  
  79.         mySet.add("aaa");  
  80.         mySet.add("bbb");  
  81.         System.out.println("为mySet加入aaa, bbb元素后: ");  
  82.         output(mySet);  
  83.         //删除元素  
  84.         mySet.remove("aaa");  
  85.         System.out.println("mySet删除aaa元素后: ");  
  86.         output(mySet);  
  87.         //增加另外一个集合中的所有元素  
  88.         List list = new ArrayList();  
  89.         list.add("aaa");  
  90.         list.add("aaa");  
  91.         list.add("fff");  
  92.         mySet.addAll(list);  
  93.         System.out.println("mySet添加另外一个集合的所有元素后: ");  
  94.         output(mySet);  
  95.         //删除除了另外一个集合包含的以外的所有元素  
  96.         mySet.retainAll(list);  
  97.         System.out.println("mySet删除除了另外一个集合包含的以外的所有元素后: ");  
  98.         output(mySet);  
  99.         //删除另外一个集合包含的所有元素  
  100.         mySet.removeAll(list);  
  101.         System.out.println("mySet删除另外一个集合包含的所有元素后: ");  
  102.         output(mySet);  
  103.         //获取Set中元素的个数  
  104.         System.out.println("mySet中当前元素的个数: " + mySet.size());  
  105.         //判断Set中元素个数是否为0  
  106.         System.out.println("mySet中当前元素为0?  " + mySet.isEmpty());  
  107.           
  108.         /** 
  109.          * (1)Set不允许重复元素,因此加入Set的Object必须定义equals()方法以确保对象的唯一性。 
  110.          * (2)HashSet采用散列函数对元素进行排序,是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode()。 
  111.          * (3)TreeSet采用红黑树的数据结构进行排序元素,能保证元素的次序,使用它可以从Set中提取有序的序列。 
  112.          * 需要注意的是,生成自己的类时,Set需要维护元素的存储顺序,因此要实现Comparable接口并定义compareTo()方法。 
  113.          * (4)LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。 
  114.      */  
  115.     }  
  116. }  

posted on 2013-11-06 00:16  heartstage  阅读(418)  评论(0编辑  收藏  举报

导航