JAVA集合彙總

JAVA集合出現:

            1.由於傳統數組的長度大小是一定的,而集合的長度大小是不固定的,而且集合只能存儲引用類型數據,不能存儲基本類型數據;(JAVA的Integer 是對int的封裝);

JAVA基本分類:

           1.List(列表)

           2.Set(集合)

           3.Map(映射)

           Collection 接口 :Collection是最基本的集合接口,聲明瞭適用於JAVA集合(只包括Set和List)的通用方法。 Set 和List 都繼承了Conllection,Map;          

            Collection接口的方法: 

            boolean add(Object o)      :向集合中加入一個對象的引用 

            void clear():刪除集合中所有的對象,即不再持有這些對象的引用 

            boolean isEmpty()    :判斷集合是否爲空 

            boolean contains(Object o) : 判斷集合中是否持有特定對象的引用 

           Iterartor iterator()  :返回一個Iterator對象,可以用來遍歷集合中的元素 

           boolean remove(Object o) :從集合中刪除一個對象的引用 

           int size()       :返回集合中元素的數目 

           Object[] toArray()    : 返回一個數組,該數組中包括集合中的所有元素

           Iterator() 和toArray() 方法都用於集合的所有的元素,前者返回一個Iterator對象,後者返回一個包含集合中所有元素的數組。

   1.Set(集合): Set是最簡單的一種集合。集合中的對象不按特定的方式排序,並且沒有重複對象。 如果試圖把兩個相同元素加入同一個集合中,add方法返回false。

           Set判斷兩個對象相同不是使用==運算符,而是根據equals方法。也就是說,只要兩個對象用equals方法比較返回true,Set就不 會接受這兩個對象。

           HashSet  :HashSet類按照哈希算法來存取集合中的對象,存取速度比較快 ; 不能保證元素的排列順序,順序有可能發生變化;集合元素可以是null,但只能放入一個null;

     不是同步的;

          LinkedHashSet:保留插入順序,迭代訪問性能比HashSet好,但插入不如HashSet;

          TreeSet:TreeSet類實現了SortedSet接口,能夠對集合中的對象進行排序;TreeSet支持兩種排序方式,自然排序 和定製排序,其中自然排序爲默認的排序方式。向TreeSet中加入的應該是同一個類的對象;自然排序是根據集合元素的大小,以升序排列,如果要定製排序,應該使用Comparator接口,實現 int compare(T o1,T o2)方法;

   示例代碼如下;

       package test;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class SetTest {
    public static void main(String[] args){
        //載入自定義的排序規則
        Set<Student> qingHua=new TreeSet<Student>(new TestComparator());
        qingHua.add(new Student(170,120,100.1));
        qingHua.add(new Student(175,115,100.2));
        qingHua.add(new Student(180,110,100.3));
        for(Student s:qingHua){
            System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
        }
        Student.sortMold=2;
        for(Student s:qingHua){
            System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
        }
        Student.sortMold=3;
        for(Student s:qingHua){
            System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
        }
    }
}

class TestComparator implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        if(Student.sortMold==1){
            if(o1.getHeight()>o2.getHeight()){
                //返回-1的是需要的順序
                return -1;
            }else if(o1.getHeight()<o2.getHeight()){
                return 1;
            }else{
                return 0;
            }
        }else if(Student.sortMold==2){
            if(o1.getWeight()<o1.getWeight()){
                return 1;
            }else if(o1.getWeight()>o1.getWeight()){
                return -1;
            }else{
                return 0;
            }
        }else if(Student.sortMold==3){
            if(o1.getGrade()>o2.getGrade()){
                return -1;
            }else if(o1.getGrade()<o2.getGrade()){
                return 1;
            }else{
                return 0;
            }
        }
        return 0;
    }
    
}

class Student{
    public static int sortMold =1;    //排序模式,1爲身高,2爲體重,3爲成績
    private int height;    //身高
    private int weight;    //體重
    private Double grade;    //成績
    Student(int height,int weight,Double grade){
        this.height=height;
        this.weight=weight;
        this.grade=grade;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }
    public Double getGrade() {
        return grade;
    }
    public void setGrade(Double grade) {
        this.grade = grade;
    }
}

  2.List(列表): List的特徵是其元素以線性方式存儲,集合中可以存放重複對象。 

      ArrayList 是一個可改變大小的數組.當更多的元素加入到ArrayList中時,其大小將會動態地增長.內部的元素可以直接通過get與set方法進行訪問,因爲ArrayList本質上就是一個數組.
     LinkedList 是一個雙鏈表,在添加和刪除元素時具有比ArrayList更好的性能.但在get與set方面弱於ArrayList.
當然,這些對比都是指數據量很大或者操作很頻繁的情況下的對比,如果數據和運算量很小,那麼對比將失去意義.
     Vector 和ArrayList類似,但屬於強同步類。如果你的程序本身是線程安全的(thread-safe,沒有在多個線程之間共享同一個集合/對象),那麼使用ArrayList是更好的選擇。
Vector和ArrayList在更多元素添加進來時會請求更大的空間。Vector每次請求其大小的雙倍空間,而ArrayList每次對size增長50%.而 LinkedList 還實現了 Queue 接口,該接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
注意: 默認情況下ArrayList的初始容量非常小,所以如果可以預估數據量的話,分配一個較大的初始值屬於最佳實踐,這樣可以減少調整大小的開銷。

  3.Map(映射):Map主要用於存儲健值對,根據鍵得到值,因此不允許鍵重複(重複了覆蓋了),但允許值重複。

     HashMap:

           Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。
           HashMap最多隻允許一條記錄的鍵爲Null;允 許多條記錄的值爲 Null;

           HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。

           如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

    Hashtable:HashMap類似,它繼承自Dictionary類,

           不同的是:它不允許記錄的鍵或者值爲空;

          它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。

     LinkedHashMap:

        保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以 在構造時用帶參數,按照應用次數排序。

        在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會 比LinkedHashMap慢,因爲LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。

    TreeMap:實現SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。


    一般情況下,我們用的最多的是HashMap,HashMap裏面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度.

    在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。

    TreeMap取出來的是排序後的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。

    LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap可以實現,它還可以按讀取順序來排列,像連接池中可以應 用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章