java基础系列:集合总结(4)
使用 S e t s
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 里提到一個
順序集合
重復的值被添加到 Set,但在打印的時候,我們會發現 Set 只接受每個值的一個實例。運行這個程序時,會注意到由 HashSet 維持的順序與 ArraySet 是不同的。這是由于它們采用了不同的方法來保存元素,以便它們以后的定位。 ArraySet 保持著它們的順序狀態,而 HashSet 使用一個散列函數,這是特別為快速檢索設計的)。
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 duplicatesfill(a);a.addAll(fill(new TreeSet()));System.out.println(a);}public static void main(String[] args) {test(new HashSet());test(new TreeSet());} }但只有要把類置入一個 HashSet 的前提下,才有必要使用 hashCode()—— 這種情況是完全有可能的,因為通常應先選擇作為一個 Set 實現。
使用 M a p s
Map(接口) 維持“鍵-值”對應關系(對),以便通過一個鍵查找相應的值
HashMap 基于一個散列表實現(用它代替 Hashtable)。針對“鍵-值”對的插入和檢索,這種形式具有最穩定的性能。可通過構建器對這一性能進行調整,以便設置散列表的“能力”和“裝載因子”
ArrayMap 由一個 ArrayList 后推得到的 Map。對反復的順序提供了精確的控制。面向非常小的 Map 設計,特別是那些需要經常創建和刪除的。對于非常小的Map,創建和反復所付出的代價要比
HashMap 低得多。但在Map 變大以后,性能也會相應地大幅度降低
TreeMap 在一個“紅-黑”樹的基礎上實現。查看鍵或者“鍵-值”對時,它們會按固定的順序排列(取決于 Comparable 或 Comparator,稍后即會講到)。 TreeMap 最大的好處就是我們得到的是已排好序的結果。TreeMap 是含有 subMap()方法的唯一一種 Map,利用它可以返回樹的一部分
遍歷map實例
package com.test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Test { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("first", "linlin"); map.put("second", "好好學java"); map.put("third", "sihai"); map.put("first", "sihai2"); // 第一種:通過Map.keySet遍歷key和value System.out.println("===================通過Map.keySet遍歷key和value:==================="); for (String key : map.keySet()) { System.out.println("key= " + key + " and value= " + map.get(key)); } // 第二種:通過Map.entrySet使用iterator遍歷key和value System.out.println("===================通過Map.entrySet使用iterator遍歷key和value:==================="); Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } // 第三種:通過Map.entrySet遍歷key和value System.out.println("===================通過Map.entrySet遍歷key和value:==================="); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } // 第四種:通過Map.values()遍歷所有的value,但是不能遍歷鍵key System.out.println("===================通過Map.values()遍歷所有的value:==================="); for (String v : map.values()) { System.out.println("value= " + v); } } }輸出結果如下:
===================通過Map.keySet遍歷key和value:===================
key= third and value= sihai
key= first and value= sihai2
key= second and value= 好好學java
===================通過Map.entrySet使用iterator遍歷key和value:===================
key= third and value= sihai
key= first and value= sihai2
key= second and value= 好好學java
===================通過Map.entrySet遍歷key和value:===================
key= third and value= sihai
key= first and value= sihai2
key= second and value= 好好學java
===================通過Map.values()遍歷所有的value:===================
value= sihai
value= sihai2
value= 好好學java
總結
以上是生活随笔為你收集整理的java基础系列:集合总结(4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础系列:集合基础(3)
- 下一篇: java基础系列:集合总结(5)