java集合是一個重點和難點,若是咱們刻意記住全部的用法與區別則是不太現實的,
以前一直在使用相關的集合類,可是沒有仔細研究區別,如今來把平時使用比較頻繁的一些集合
作一下分析和總結,目的就是之後在須要使用的時候能給找到適合的類。
說到集合,先來看看數組,Array和集合相比,主要的問題是不能動態的改變長度,也不能刪除元素,
在某些場景下不適合使用,而集合的話會靈活不少。
集合中咱們經常使用的3個接口是:List,Set和Map,而對應的實現類經常使用的有ArrayList,TreeSet和HashMap,
接下來就來總結一下這3個實現類的特色。
Collection 是層次結構中的根接口,JDK 不提供此接口的任何直接實現:它提供更具體的
子接口(如 Set 和 List)實現。
Set,無序的,一個不包含重複元素的 collection。更正式地說,set 不包含知足 e1.equals(e2) 的元素對 e1 和 e2,
而且最多包含一個 null 元素。正如其名稱所暗示的,此接口模仿了數學上的 set 抽象。
List是一個有序的集合,能夠包含重複的元素,提供了按索引訪問的方式。
Map和Collection接口沒有關係,Map包含了key-value對,key惟一,value不惟一。
接下來咱們依次來講說最經常使用的ArrayList,TreeSet和HashMap。
1. ArrayList是List接口的大小可變數組的實現,是一個其容量可以動態增加的動態數組。它繼承了AbstractList,
實現了List、RandomAccess, Cloneable, java.io.Serializable。
基本的ArrayList,適合在隨機訪問元素的場景,可是在List中間插入和移除元素時較慢。對於頻繁插入和刪除的地方,
適合使用LinkedList,基於鏈表的數據結構。ArrayList 實現java.io.Serializable接口,這意味着ArrayList支持序列化,能經過序列化去傳輸。
同時,ArrayList的操做不是線程安全的!通常在單線程中才使用ArrayList。java
下面看一個簡單的例子,看看ArrayList
的使用:數組
import java.util.*; public class ArraySort { public static void main(String[] args) { // 實例化一個List集合,用來存放int List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 100; i++) {// 執行100次for,獲取隨機整數,並放在集合中 list.add((int) (Math.random() * 1000)); //System.out.println(Math.random()); } // 遍歷 Integer value = null; Iterator iter = list.iterator(); while (iter.hasNext()) { value = (Integer)iter.next(); System.out.println(value); } // 排序 Collections.sort(list); // 打印,查看結果 for (int i = 0; i < list.size(); i++) { if (i % 15 == 0) { System.out.println(); } System.out.print(list.get(i) + " "); } } }
具體方法的使用能夠在用到的時候查詢JDK API手冊安全
2.Set是無序的,而TreeSet是有序的,TreeSet的本質是一個"有序的,而且沒有重複元素"的集合,它是經過TreeMap實現的。數據結構
看一下具體的例子:dom
import java.util.*; public class TreeSetTest { public static void main(String args[]) { // Create a tree set Set ts = new TreeSet(); // Add elements to the tree set ts.add("Cherry"); ts.add("Alinda"); ts.add("Bay"); ts.add("Floria"); ts.add("David"); System.out.println(ts); } }
輸出:[Alinda, Bay, Cherry, David, Floria],默認按照字典順序升序排列
此類保證排序後的 set 按照升序排列元素,根據使用的構造方法不一樣,可能會按照元素的天然順序 進行排序(參見 Comparable),或按照在建立 set 時所提供的比較器進行排序。
3.HashMap基於哈希表的 Map 接口的實現。性能
先來看看API手冊中的說法:HashMap 的實例有兩個參數影響其性能:初始容量 和加載因子。容量 是哈希表中桶的數量,
初始容量只是哈希表在建立時的容量。加載因子 是哈希表在其容量自動增長以前能夠達到多滿的一種尺度。
當哈希表中的條目數超出了加載因子與當前容量的乘積時,經過調用 rehash 方法將容量翻倍。
再來看一下具體到code:spa
import java.util.*; /** * @author * */ public class MapTest { public static void main(String[] args){ Random r = new Random(); Map<String,Integer> map=new HashMap<String,Integer>(); map.put("one",r.nextInt(100)); map.put("two",r.nextInt(100)); map.put("three",r.nextInt(100)); map.put("four",r.nextInt(100)); map.put("five",r.nextInt(100)); System.out.println("map:"+map); Integer integ = null; String key = null; Iterator iter = map.entrySet().iterator(); while(iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); // 獲取key key = (String)entry.getKey(); // 獲取value integ = (Integer)entry.getValue(); System.out.println("Key:"+key+" Value:"+integ); } } }
以上主要是java集合的典型的幾個類的簡單介紹,須要在具體的場景下來仔細研究差別。線程