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。

下面看一個簡單的例子,看看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實現的。

看一下具體的例子:

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:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM