熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

使用Sets

2022-06-13   來源: JSP教程 

  Set擁有與Collection完全相同的接口所以和兩種不同的List不同它沒有什麼額外的功能相反Set完全就是一個Collection只是具有不同的行為(這是實例和多形性最理想的應用用於表達不同的行為)在這裡一個Set只允許每個對象存在一個實例(正如大家以後會看到的那樣一個對象的的構成是相當復雜的)
  

  Set(接口) 添加到Set的每個元素都必須是獨一無二的否則Set就不會添加重復的元素添加到Set裡的對象必須定義equals()從而建立對象的唯一性Set擁有與Collection完全相同的接口一個Set不能保證自己可按任何特定的順序維持自己的元素
  HashSet* 用於除非常小的以外的所有Set對象也必須定義hashCode()
  ArraySet 由一個數組後推得到的Set面向非常小的Set設計特別是那些需要頻繁創建和刪除的對於小Set與HashSet相比ArraySet創建和反復所需付出的代價都要小得多但隨著Set的增大它的性能也會大打折扣不需要HashCode()
  TreeSet 由一個紅黑樹後推得到的順序Set(注釋⑦)這樣一來我們就可以從一個Set裡提到一個順序集合
  
  ⑦直至本書寫作的時候TreeSet仍然只是宣布尚未正式實現所以這裡沒有提供使用TreeSet的例子
  
  下面這個例子並沒有列出用一個Set能夠做的全部事情因為接口與Collection是相同的前例已經練習過了相反我們要例示的重點在於使一個Set獨一無二的行為
  
  //: Setjava
  // Things you can do with Sets
  package cnewcollections;
  import javautil*;
  
  public class Set {
   public static void testVisual(Set a) {
  Collectionfill(a);
  Collectionfill(a);
  Collectionfill(a);
  Collectionprint(a); // No duplicates!
  // Add another set to this one:
  aaddAll(a);
  aadd(one);
  aadd(one);
  aadd(one);
  Collectionprint(a);
  // Look something up:
  Systemoutprintln(ntains(\one\): +
   ntains(one));
   }
   public static void main(String[] args) {
  testVisual(new HashSet());
  testVisual(new TreeSet());
   }
  } ///:~
  
  重復的值被添加到Set但在打印的時候我們會發現Set只接受每個值的一個實例
  運行這個程序時會注意到由HashSet維持的順序與ArraySet是不同的這是由於它們采用了不同的方法來保存元素以便它們以後的定位ArraySet保持著它們的順序狀態而HashSet使用一個散列函數這是特別為快速檢索設計的)創建自己的類型時一定要注意Set需要通過一種方式來維持一種存儲順序就象本章早些時候展示的groundhog(土拔鼠)例子那樣下面是一個例子
  
  //: Setjava
  // Putting your own type in a Set
  package cnewcollections;
  import javautil*;
  
  class MyType implements Comparable {
   private int i;
   public MyType(int n) { i = n; }
   public boolean equals(Object o) {
  return
   (o instanceof MyType)
   && (i == ((MyType)o)i);
   }
   public int hashCode() { return i; }
   public String toString() { return i + ; }
   public int compareTo(Object o) {
  int i = ((MyType) o)i;
  return (i < i ? -1 : (i2 == i ? 0 : 1));
   }
  }
  
  public class Set2 {
   public static Set fill(Set a, int size) {
  for(int i = 0; i < size; i++)
   a.add(new MyType(i));
  return a;
   }
   public static Set fill(Set a) {
  return fill(a, 10);
   }
   public static void test(Set a) {
  fill(a);
  fill(a); // Try to add duplicates
  fill(a);
  a.addAll(fill(new TreeSet()));
  System.out.println(a);
   }
   public static void main(String[] args) {
  test(new HashSet());
  test(new TreeSet());
   }
  } ///:~
  
  對equals()及hashCode()的定義遵照“groundhog”例子已經給出的形式。tW.WinGWit.cOm在兩種情況下都必須定義一個equals()。但只有要把類置入一個HashSet的前提下,才有必要使用hashCode()——這種情況是完全有可能的,因為通常應先選擇作為一個Set實現。
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19723.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.