Java -- 容器使用 Set, List, Map, Queue
1. ArrayList
ArrayList<String> c = new ArrayList<String>(); c.add("hello"); c.add("world"); String a = new String("aya"); c.add(a); for( Object obj : c ) { System.out.println( (String)obj ); } c.set(2, "111"); Iterator<String> it = c.iterator(); while(it.hasNext()) { System.out.println( (String)it.next() ); } ArrayList 的迭代器還有 ListIterator 可以有正反兩種查詢,先hasNext知道最后 hasPrevious才能有值 [java] view plaincopy ListIterator<String> it2 = c.listIterator(); while(it2.hasNext()) { System.out.println( "hasNext " + (String)it2.next() ); } while(it2.hasPrevious()) { System.out.println( "hasPrevious " + (String)it2.previous() ); } |
2. HashSet 集合是無序的。
HashSet集合判斷兩個元素相等的標準是兩個對象通過equals 方法比較相等,并且兩個對象的hashCode()方法返回值也相等。
向HashSet中添加可變對象時,必須小心,如果修改HashSet集合中的對象有可能導致該對象與集合中其他對象相等,從而導致Hashset無法準確訪問該對象。
3. TreeSet 集合有序
由于TreeSet有序, 所有有訪問第一個,前一個,后一個,最后一個并可以截取子集。
排序的順序并不是根據插入的順序,而是根據元素實際值來排序。
TreeSet<Integer> nums = new TreeSet<Integer>(); nums.add(4); nums.add(3); nums.add(2); nums.add(1); System.out.println(nums); //整個集合 System.out.println(nums.first()); System.out.println(nums.last()); System.out.println(nums.headSet(3)); //小于3,但不包括3 System.out.println(nums.tailSet(3)); //大于等于3 System.out.println(nums.subSet(1, 3)); 大于等于1,小于3 |
結果為
[1, 2, 3, 4]
1
4
[1, 2]
[3, 4]
[1, 2]
TreeSet自然排序:根據元素大小,升序排列。 對于TreeSet判斷兩個元素相等的標準是,兩個對象通過equals方法比較返回true,并且通過compareTo(Object obj)比較 返回0。
和HashSet一樣集合中為可變對象時,修改對象值后可能容易出錯,為了健壯性,HashSet和TreeSet推薦放入不可變對象。
TreeSet定序排列: 使用comparator接口幫助。
4. EnumSet 是一個專為枚舉類設計的集合類,其中所有的值都是指定枚舉類型的枚舉值。沒有暴露構造器,必須用靜態方法創建。
enum Season { SPRING,SUMMER,FALL,WINTER; } public class Main { public static void main(String[] args) { EnumSet es1 = EnumSet.allOf(Season.class); //創建一個EnumSet集合,集合元素就是Season枚舉類的全部枚舉值 System.out.println(es1); EnumSet es2 = EnumSet.noneOf(Season.class); //空集合,但指定其中的元素是Season類的枚舉值 System.out.println(es2); es2.add(Season.SPRING); es2.add(Season.SUMMER); System.out.println(es2); EnumSet es3 = EnumSet.of(Season.SPRING, Season.SUMMER); // 以指定枚舉值創建EnumSet System.out.println(es3); EnumSet es4 = EnumSet.range(Season.SPRING, Season.FALL); // 范圍值 System.out.println(es4); EnumSet es5 = EnumSet.complementOf(es4); //Season中 除去es4里剩下的部分 為es5 System.out.println(es5); } } |
輸出結果:
[SPRING, SUMMER, FALL, WINTER]
[]
[SPRING, SUMMER]
[SPRING, SUMMER]
[SPRING, SUMMER, FALL]
[WINTER]
5. LinkedList 不僅可以當做雙向隊列使用,還可以當做“棧”使用,其包含有 pop出棧 和 push入棧 方法
LinkedList<String> books = new LinkedList<String>(); books.offer("test1"); //加入隊列尾部 books.push("test2"); //入棧 books.offerFirst("test3"); //放入頭部 for(int i=0; i<books.size(); i++) { System.out.println( books.get(i) ); } System.out.println( books.peekFirst() ); //訪問不刪除 System.out.println( "log1: " + books ); System.out.println( books.pollFirst() ); //訪問并刪除 System.out.println( "log2: " + books ); |
輸出結果:
test3
test2
test1
test3
log1: [test3, test2, test1]
test3
log2: [test2, test1]
6. Map
HashMap 和 HashTable 判斷Value相等的條件只需要equals方法返回true即可,判斷Key相等的條件是equals()和hashCode()返回值都相等。
LinkedHashMap以鏈表來維護內部順序。性能低于HashMap,消耗低于TreeMap。
TreeMap key的排序也是根據紅黑樹排列,有兩種排序方式,自然排序和定制排序。
WeekHashMap 只保留key對應對象的弱引用,可能被垃圾回收。
enum Season { SPRING,SUMMER,FALL,WINTER; } public class Main { public static void main(String[] args) { HashMap<Integer, String> map1 = new HashMap<Integer, String>(); map1.put(1, "hello"); map1.put(2, "world"); System.out.println(map1); System.out.println(map1.containsKey(3)); System.out.println(map1.containsValue("world")); map1.put(2, "aya"); System.out.println(map1); for(Map.Entry<Integer, String> m : map1.entrySet()) { System.out.println(m); System.out.println(m.getKey()); } EnumMap map2 = new EnumMap(Season.class); map2.put(Season.SPRING, "spring"); map2.put(Season.SUMMER, "summer"); System.out.println(map2); } } |