麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

使用Sets

2019-11-18 13:22:30
字體:
來源:轉載
供稿:網友

  Set擁有與Collection完全相同的接口,所以和兩種不同的List不同,它沒有什么額外的功能。相反,Set完全就是一個Collection,只是具有不同的行為(這是實例和多形性最理想的應用:用于表達不同的行為)。在這里,一個Set只答應每個對象存在一個實例(正如大家以后會看到的那樣,一個對象的“值”的構成是相當復雜的)。
  
使用Sets


  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獨一無二的行為:
  
  //: Set1.java
  // Things you can do with Sets
  package c08.newcollections;
  import java.util.*;
  
  public class Set1 {
   public static void testVisual(Set a) {
  Collection1.fill(a);
  Collection1.fill(a);
  Collection1.fill(a);
  Collection1.PRint(a); // No duplicates!
  // Add another set to this one:
  a.addAll(a);
  a.add("one");
  a.add("one");
  a.add("one");
  Collection1.print(a);
  // Look something up:
  System.out.println("a.contains(/"one/"): " +
   a.contains("one"));
   }
   public static void main(String[] args) {
  testVisual(new HashSet());
  testVisual(new TreeSet());
   }
  } ///:~
  
  重復的值被添加到Set,但在打印的時候,我們會發現Set只接受每個值的一個實例。
  運行這個程序時,會注重到由HashSet維持的順序與ArraySet是不同的。這是由于它們采用了不同的方法來保存元素,以便它們以后的定位。ArraySet保持著它們的順序狀態,而HashSet使用一個散列函數,這是非凡為快速檢索設計的)。創建自己的類型時,一定要注重Set需要通過一種方式來維持一種存儲順序,就象本章早些時候展示的“groundhog”(土拔鼠)例子那樣。下面是一個例子:
  
  //: Set2.java
  // Putting your own type in a Set
  package c08.newcollections;
  import java.util.*;
  
  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 i2 = ((MyType) o).i;
  return (i2 < 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”例子已經給出的形式。在兩種情況下都必須定義一個equals()。但只有要把類置入一個HashSet的前提下,才有必要使用hashCode()——這種情況是完全有可能的,因為通常應先選擇作為一個Set實現。

上一篇:使用Lists

下一篇:決定實施方案

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 91精品观看91久久久久久国产 | 久久撸视频 | 国产美女爽到喷白浆的 | 一级空姐毛片 | 欧美a∨一区二区三区久久黄 | 成人午夜免费看 | 免费毛片a线观看 | 天天干天天透 | av一二三四区 | 日韩欧美中文字幕视频 | 色阁阁69婷婷 | 男人午夜小视频 | 黄色网址免费在线播放 | 亚洲国产美女视频 | 日韩专区在线 | 久久久久久久一区二区三区 | 黑人一区二区 | 在线成人看片 | 欧美精品色精品一区二区三区 | 欧美黄色免费视频 | 久久精品中文字幕一区二区 | 亚洲午夜影院在线观看 | 综合国产在线 | 成人午夜天堂 | 毛片国产 | 精品亚洲午夜久久久久91 | 69性欧美高清影院 | 久久久久久亚洲综合影院红桃 | 粉嫩粉嫩一区二区三区在线播放 | 性大片免费看 | 国产1区2区3区在线观看 | 国产精品久久久久久久久久久久久久久久 | 在线视频 欧美日韩 | 国产美女爽到喷白浆的 | 国产日韩大片 | 午夜精品久久久久久久96蜜桃 | 成人午夜免费av | 免费看操片 | 精品久久久久99 | 日本中文字幕高清 | 国产污污视频 |