1. 程式人生 > >java中 collection 與 collections 的區別

java中 collection 與 collections 的區別

今天面試時,筆試題遇到這個問題,從網上查了些資料,總結如下:
1、java.util.Collection 是一個集合介面。它提供了對集合物件進行基本操作的通用介面方法。Collection介面在Java 類庫中有很多具體的實現。
Collection介面的意義是為各種具體的集合提供了最大化的統一操作方式。
collection主要分為三種類型:

Set(集) 元素無放入順序,不可重複
List(列表) 元素有放入順序,可重複
Map(對映) 元素由鍵值對構成,無順序

說明:

世上本沒有集合(只有陣列),但有人想要,所以就有了集合
有人想有可以自動擴充套件的陣列,所以有了List
有人想有自動排序的陣列,所以有了TreeSet,TreeList,Tree**
因為集合是對陣列做的封裝,所以,陣列永遠比任何一個集合要快

  • List介面主要有三個實現類:LinkedList,ArrayList,Vector LinkedList:底層基於連結串列實現,連結串列記憶體是散亂的,每一個元素儲存本身記憶體地址的同時還儲存下一個元素的地址。
    連結串列增刪快,查詢慢
    ArrayList和Vector的區別:ArrayList是非執行緒安全的,效率高;Vector是基於執行緒安全的,效率低
  • Set介面主要有兩個實現類:HashSet(底層由HashMap實現)和LinkedHashSet
  • Map介面主要有三個實現類:HashMap,HashTable和LinkeHashMap
    HashMap非執行緒安全,高效,支援null;HashTable執行緒安全,低效,不支援null
    其實最主要的是,list是用來處理序列的,而set是用來處理集的。Map儲存的是鍵值對 ;set 一般無序不重複;map kv 結構 ;list 有序

collection的方法:參見 jdk手冊 - java.util-collection-方法摘要,有詳細的方法說明

2、java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多型方法。此類不能例項化,就像一個工具類,服務於Java的Collection框架
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全等操作
1) 排序(Sort)
使用sort方法可以根據元素的自然順序 對指定列表按升序進行排序。列表中的所有元素都必須實現 Comparable 介面。
此列表內的所有元素都必須是使用指定比較器可相互比較的

import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;  

public class TestCollections {  

    public static void main(String args[]) {  
        //注意List是實現Collection介面的  
        List list = new ArrayList();  
        int array[] = { 12, 11, 23, 56, 31 };  
        for (int i = 0; i < array.length; i++) {  
            list.add(new Integer(array[i]));  
        }  
        Collections.sort(list);  
        for (int i = 0; i < array.length; i++) {  
            System.out.print(list.get(i)+",");  
        }  
        // 結果:11,12,23,31,56,
    }  
}  

2) 混排(Shuffling)
混排演算法所做的正好與 sort 相反: 它打亂在一個 List 中可能有的任何排列的蹤跡。也就是說,基於隨機源的輸入重排該 List, 這樣的排列具有
相同的可能性(假設隨機源是公正的)。這個演算法在實現一個碰運氣的遊戲中是非常有用的。例如,它可被用來混排代表一副牌的 Card 物件的一個List 。另外,在生成測試案例時,它也是十分有用的。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List list = new ArrayList();
        double array[] = {112, 111, 23, 456, 231 };
        for (int i = 0; i < array.length; i++) {
            list.add(new Double(array[i]));
        }
        Collections.sort(list);
        for (int i = 0; i < array.length; i++) {
            System.out.print(list.get(i)+",");
        }
        System.out.println();
        Collections.shuffle(list);
        for (int i = 0; i < array.length; i++) {
            System.out.print(list.get(i)+" ");
        }
    }
}

//結果:
23.0,111.0,112.0,231.0,456.0,
111.0 231.0 456.0 112.0 23.0

3) 反轉(Reverse)
使用Reverse方法可以根據元素的自然順序 對指定列表按降序進行排序。
Collections.reverse(list)

4) 替換所以的元素(Fill)
使用指定元素替換指定列表中的所有元素。

List list = new ArrayList();
String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j<str.length;j++){
list.add(new String(str[j]));
}
Collections.fill(list,"aaa");
for (int i = 0; i < list.size(); i++) {
System.out.println("list[" + i + "]=" + list.get(i));
}
//結果:aaa,aaa,aaa,aaa,aaa

5) 拷貝(Copy)
用兩個引數,一個目標 List 和一個源 List, 將源的元素拷貝到目標,並覆蓋它的內容。目標 List 至少與源一樣長。如果它更長,則在目標 List 中的剩餘元素不受影響。
Collections.copy(list,li): 後面一個引數是目標列表 ,前一個是源列表

double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
List li = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
double arr[] = {1131,333};
String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j<arr.length;j++){
li.add(new Double(arr[j]));
}
Collections.copy(list,li);
for (int i = 0; i <list.size(); i++) {
System.out.println("list[" + i + "]=" + list.get(i));
}
//結果:1131,333,23,456,231

6) 返回Collections中最小元素(min)
根據指定比較器產生的順序,返回給定 collection 的最小元素。collection 中的所有元素都必須是通過指定比較器可相互比較的
Collections.min(list)

7) 返回Collections中最小元素(max)
根據指定比較器產生的順序,返回給定 collection 的最大元素。collection 中的所有元素都必須是通過指定比較器可相互比較的
Collections.max(list)

8) lastIndexOfSubList
返回指定源列表中最後一次出現指定目標列表的起始位置
int count = Collections.lastIndexOfSubList(list,li);

9) IndexOfSubList
返回指定源列表中第一次出現指定目標列表的起始位置
int count = Collections.indexOfSubList(list,li);

10) Rotate
根據指定的距離迴圈移動指定列表中的元素
Collections.rotate(list,-1);
如果是負數,則正向移動,正數則方向移動