1. 程式人生 > >Java集合框架知識總結

Java集合框架知識總結

log 增強for循環 stat sort 訪問 字符串 繼承 操作類 map對象

兩大體系:Collection,Map

一、Collection:

List 接口 :

  List:裏面對象全部是有序的(通過三種方法來遍歷)
    ArrayList,LinkedList,Vertor

ArrayList:本質上 ArrayList 裏維護的就是動態可變長度的數組。

 常用方法:
  增:add(4) 對象 位置+對象 集合 集合+位置。
   刪:remove(2)下標刪對象,直接刪對象。
  改:set(1) 下標 對象。
   查:get() 下標得對象, indexOf()對象得下標。

  contains()必須是同一個對象才返回true iterator() size()。


LinkedList:本質上 LinkedList 裏維護的是動態可變長度的雙向鏈表

 常用方法:
  增:add(4) 對象 位置,對象 集合 位置,集合 +2(對象) 新增:addFirst() addLast()。
  刪:remove(2)下標刪對象,直接刪對象 +2(對象) 新增:removeFirst() removeLast()。
  改:set(1) 下標 對象
  查:get() 下標得對象 indexOf()對象得下標 +2(對象) 新增:getFirst() getLast()。

   contains() iterator()size()。


Vertor:線程安全,執行效率非常低

 常用方法:
  增:add(4) 對象 位置,對象 集合 位置,集合 addElement(對象) insertElement(對象)。
   刪:remove(2)下標刪對象,直接刪對象 removeElement(對象) removeAllElment()。
   改:set(1) 下標,對象 setElementAt(對象,下標)。
   查:get() 下標得對象 indexOf()對象得下標。

   contains() iterator() size()。

   iterator() :hasNext()判斷有沒有下一個元素。
  next()獲取下一個元素。
  remove()在叠代器中移除元素。

Set接口:
不允許出現重復的方法,允許有一個null值,都沒有順序索引(通過增強for循環和叠代來遍歷),所以查不了,改不了。
   要想存入Set,必須重寫equals()和hashCode()方法(String已經重寫),兩者返回值都為真表明相等,比的是內容。
   其實一個equals()就可以,但是當存入數據量大的時候,一一比較效率非常低,加入hashCode,就是來判斷不是同一個對象的。
   用hashCode()無法判斷是同一個對象。

   因為所有的已經存入的對象保存在一個table裏面,比較的效率非常高。
如果已存在,是不能再往裏面添加(而Map是後面覆蓋前面)。
HashSet:
  內部維護的是HashMap的一個實例,存的是key的集合。
  元素的表現是無序的,但一旦添加完元素,元素位置是固定的(也就是說你無論再運行多少遍,這個顯示的順序都一樣),再添加新元素,不會影響前面元素的位置,給添加的元素分配位置,只要不打亂前面的元素位置,前面的元素位置就不會再發生變化。

 常用方法:
  增:add(對象)。
  刪:clear()移除所有對象 ,remove(對象)。
  改:沒有,沒下標。
  查:除了遍歷出所有,沒有,因為沒有下標。

  contains()內容相同就返回true iterator() size()。


LinkedHashSet:
  HashSet的子類,只有四個新增的構造器,沒有其他新增方法,內部維護的是LinkedHashMap的一個實例,是雙向鏈表結構。
  元素存放順序和叠代順序一樣(按順序)。
  常用方法同HashSet。


TreeSet:

  確保元素處於排序狀態,底層為樹結構。使用它可以從Set中提取有序的序列。

  兩種排序方法:自然排序和定制排序,默認采用自然排序。
  自然排序:會調用集合元素的comparaTo(對象)方法來比較元素之間的大小關系,然後把集合按升序排列(實現 Comparable接口)。
  定制排序:通過Comparator(比較器)接口,需要重寫compara(對象,對象),要實現定制排序,需要把comparator實例作為形 參傳給TreeSet的構造器。
  要想把元素放到TreeSet中,必須實現Comparable接口,同時必須實現comparaTo方法。
  或者繼承Comparator接口,然後重寫compara方法。
   first() last()lower(對象) heigher(對象) 其他視圖方法。


二、Map集合:維護"鍵值對"的關聯性

   key,value 必須都為引用類型數據
  key不可以重復(後覆蓋先),保存在Set集合中(因為Set集合裏面的元素不能重復,所以,,還必須重寫equals和hashCode()方法),經常用String,因為都已經實現
  put(key,value) remove(key) putAll(Map map) clear()清除所有 。(基本全是通過Set,也就是key,唯一性)。
   獲取key的集合:
   Set<> set= map.keySet();Iterator<> it=set.iterator();get(key) 叠代器。
   獲取value的集合:
   Collection values() 叠代器,增強for都可以。
   Entry集合:
   Set<Entry<,>> entrys = map.entrySet();
   for(Entry<String,String> entry : entrys)叠代器,增強for都可以
   get(key) containsKey(key) containsValue(value) size isEmpty() equals()比較的當然是內容啦

HashMap:
  允許key和value的值為null。
  表現是無序的 比較key相等和Set一樣。
  LinkedHashMap:子類,有序的(等同上面的HashSet和LinkedHashSet)只比HashMap慢一點。而在叠代訪問時發而更快,因為它使用鏈表維護內部次序。

TreeMap:

  有序。 基於紅黑樹數據結構的實現。查看"鍵"或"鍵值對"時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
HashTable:

  最古老,不允許key和value值為null

Properties:
  是HashTable的子類,用來處理文件的屬性。
  文件屬性必須是key_value,必須都是字符串,存取數據用put(key,value),get(key)。

Collections:
  集合操作類
  排序:
  Collections.reverse(list) 反序
  Collections.shuffle()隨機
  Collections.sort()自然順序升序
  Collections.swap(對象,位置,位置)交換
  查找:
  max()
  min()frequency(Collections,對象);
  copy(目標list,srclist)
  Collections.repalceAll(list,old對象,new對象)

  synchronizedXXX();
  synchronizedList(list)

總結:

1.線程安全的是vertor和HashTable。
2. List:允許重復的,全部有序(允許null)。
   3.Set: HashSet無序的表現(一個null),其中HashSet的子類LinkedHashSet有序,TreeSet有序。
   4.Map:HashMap無序的表現(一次null),其中HashMap的子類LinkedHashMap有序,TreeMap有序,HashTable無序(不能為null)。

   5.ArrayList:查詢效率高,增刪效率低。
   6.LinkedList:查詢效率低,增刪效率高。
   7.Vertor:執行效率非常低。

   8.HashSet:良好的增刪查詢性能。
   9.LinkedHashSet:查詢效率低,插入效率比HashSet低。

   10.Map對象高於List。因為Map除了Value外還需要一個Object的Key,從而增大了Map的容量。

  11. HashSet,HashMap的元素都是無序的,而他們的子類都是有序的,雙向鏈表,非常類似,因為HashMap中的唯一的約束就是key,而 key恰恰是被HashMap維護的
12.TreeSet和TreeMap都是有序的,兩個很類似。

13. 如果Map知道了Key,List知道了index,其性能在一百萬條數據中無多大差別。

   14.List按對象進入的順序保存對象,不做排序或編輯操作。Set對每個對象只接受一次,並使用自己內部的排序方法(通常,你只關心某個元素是否屬於 Set,而不關心它的序  否則應該使用List)。Map同樣對每個元素保存一份,但這是基於"鍵"的,Map也有內置的排序,因而不關心元素添加的 順序。如果添加元素的順序對你很重要,應該使用     LinkedHashSet或者LinkedHashMap。

15.HashMap就是使用對象的hashCode()進行快速查詢的。此方法能夠顯著提高性能。


舉個簡單的例子:

技術分享
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class TestHashMap {
    public static void main(String[] args) {    
              Map<String, String> map = new HashMap<String, String>();
        // put()往Map中添加一個元素(Key-Value)
        map.put("5", "ddd");
        map.put("1", "aaa");
        map.put("2", "bbb");
        map.put("3", "ccc");
        map.put("4", "ccc");

        // HashMap的遍歷
        Set<String> keys = map.keySet();
        Iterator<String> it = keys.iterator();
        // Iterator<String> it = map.keySet().iterator();
        System.out.println("-----------HashMap的遍歷方法一-------------");
        System.out.println("-----------map.keySet()-------------");
        while (it.hasNext()) {
            String key = it.next();
            // get返回指定key對應的value
            System.out.println(key + " : " + map.get(key));
        }
        Collection<String> c2=map.values();
        for(String str:c2){
            System.out.println(str);
        }    
        Set<Entry<String,String>> entrys = map.entrySet();
         System.out.println("-----------HashMap的遍歷方法三-------------");
         System.out.println("-----------map.entrySet()-------------");
     for(Entry<String,String> entry : entrys){
        System.out.println(entry.getKey() + " : " + entry.getValue());
        }
        System.out.println("-------------");
         //remove方法移除指定key對應的元素,返回對應的value
         System.out.println(map.remove("4"));
        // //如果key不存在,返回null,移除操作無效
         System.out.println(map.remove("9"));
        System.out.println("-----------map.remove()之後-------------");
         it = map.keySet().iterator();
         while(it.hasNext()){
         String key = it.next();
         //get返回指定key對應的value
         System.out.println(key + " : " + map.get(key));
         }
        //
         //判斷Map中是否存在指定key
         System.out.println(map.containsKey("1"));
         System.out.println(map.containsKey(new String("1")));
         //判斷Map中是否存在指定Value
         System.out.println(map.containsValue("aaa"));
         System.out.println(map.containsValue(new String("aaa")));
    }

}
技術分享

僅僅總結了常用的集合。

Java集合框架知識總結