java集合之ArrayList,TreeSet和HashMap分析

       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集合的典型的幾個類的簡單介紹,須要在具體的場景下來仔細研究差別。線程

相關文章
相關標籤/搜索