java 基礎之 Set、Map、List

hogen發表於2017-12-29

List 介面

List 繼承自 Collection 介面。List 是有序的 Collection,List 允許有重複元素,實現 List 介面的常用類有 LinkedList,ArrayList,Vector 和 Stack。

  • ArrayList

    ArrayList 實現了可變大小的陣列。它允許所有元素,包括 null。ArrayList 沒有同步

    List list = Collections.synchronizedList(new ArrayList(...));
    複製程式碼

ArrayList 遍歷輸出

  public static void main(String[] args) {
    List<String> mList = new ArrayList<String>();
    mList.add("hello");
    mList.add("張三");
    mList.add("李四");
    mList.add("王五");
    // 方法一
    for (int i = 0; i < mList.size(); i++) {
        System.out.println(mList.get(i));
    }
    // 方法二
    for (String string : mList) {
        System.out.println(string);
    }
    // 方法三
    Iterator<String> it = mList.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }
    // 把字串內容挨個輸出
    String str = "ABCDEFG";
    for (int i = 0; i < str.length(); i++) {
        System.out.println(str.charAt(i));
    }
  }
複製程式碼
  • LinkedList

LinkedList 實現了 List 介面,允許null元素,LinkedList 沒有同步方法

List list = Collections.synchronizedList(new LinkedList(...));
複製程式碼
  • Vector

Vector 非常類似 ArrayList,但是 Vector 是同步的

Set 介面

Set 繼承自 Collection 介面。Set 是一種不能包含有重複元素的集合,Set 最多有一個 null元素

  • HashSet

此類實現 Set 介面,由雜湊表(實際上是一個 HashMap 例項)支援。它不保證集合的迭代順序;特別是它不保證該順序恆久不變。集合元素可以是 null,但只能放入一個 null,存入 HashSet 的物件必須定義 hashCode()。

Set s = Collections.synchronizedSet(new HashSet(...));
複製程式碼
  • TreeSet

TreeSet 是 SortedSet 介面(Set 的子介面)的唯一實現類,TreeSet 可以確保集合元素處於排序狀態,TreeSet 支援自然排序(Comparable)和定製排序(Comparator),

Map 介面

Map 和 Collection 是2種不同的集合。Collection 可以看作是(value)的集合,而 Map 可以看作是(key,value)的集合

  • Hashtable

Hashtable繼承Map介面,實現一個key-value對映的雜湊表。任何非空(non-null)的物件都可作為key或者value。Hashtable 是同步的(線性安全)。

  • HashMap

HashMap 和 Hashtable 類似,不同之處在於 HashMap 是非同步的,並且允許 null,即 null value 和null key

對 HashMap 排序,用 Collections 中的方法

public class HaspMapTest {
    public static void main(String[] args) {
        HashMap<Integer, Users> hashMap = new HashMap<Integer, Users>();
        hashMap.put(1, new Users(22, "小娟"));
        hashMap.put(3, new Users(21, "秀秀"));
        hashMap.put(2, new Users(28, "小列"));
        HashMap<Integer, Users> sortedHashMap = sortedHashMap(hashMap);
        System.out.println("排序後:");
        System.out.println(sortedHashMap);
    }
    private static HashMap<Integer, Users> sortedHashMap(HashMap<Integer, Users> hashMap) {
        // 首先拿到 map 的鍵值對集合
        Set<Entry<Integer,Users>> entrySet = hashMap.entrySet();
        // 將 set 集合轉為 List 集合,為什麼,為了使用工具類的排序方法
        ArrayList<Entry<Integer, Users>> list = new ArrayList<Entry<Integer,Users>>(entrySet);
        Collections.sort(list, new Comparator<Entry<Integer,Users>>() {
            @Override
            public int compare(Entry<Integer, Users> o1, Entry<Integer, Users> o2) {
                ///按照要求根據 User 的 age 的倒序進行排
                return o2.getValue().getAge()-o1.getValue().getAge();
            }
        });
        LinkedHashMap<Integer,Users> linkedHashMap = new LinkedHashMap<Integer, Users>();
        //將 List 中的資料儲存在 LinkedHashMap 中
        for (Entry<Integer, Users> entry : list) {
            linkedHashMap.put(entry.getKey(), entry.getValue());
        }
        return linkedHashMap;
    }
}
複製程式碼

但凡是對集合的操作, 我們應該保持一個原則就是能用 JDK 中的 API 就有 JDK 中的 API, 比如排序演算法我們不應該 去 用 冒 泡 或 者 選 擇 , 而 是 首 先 想 到 用 Collections 集 合 工 具 類

HashMap 的遍歷輸出

public static void main(String[] args) {
    Map<Integer, Student> hm = new HashMap<Integer, Student>();

    hm.put(1001, new Student("張三"));
    hm.put(1002, new Student("熊無"));
    hm.put(1003, new Student("林之海"));

    //方法一
    Iterator<Integer> it = hm.keySet().iterator();
    while (it.hasNext()) {
        int key = it.next();
        Student values = hm.get(key);
        System.out.println("key-->"+key+"\tvalues-->"+values);
    }
    ////方法二(推薦)
    Iterator<Entry<Integer, Student>> it = hm.entrySet().iterator();
    while (it.hasNext()) {
        Entry<Integer, Student> entry = it.next();
        int key = entry.getKey();
        Student s = entry.getValue();
        System.out.println("key-->"+key+"\tvalues-->"+s);
    }
}
複製程式碼

判斷一個字串中相同的字元有多少個(用HashMap)

public static Map<Character, Integer> CountsCharacter(String str) {//str:要判斷的字串
    Map<Character, Integer> hm = new HashMap<Character, Integer>();
    char[] ch = str.toCharArray();
    for (Character c : ch) {
        if (hm.containsKey(c)) {
            int values = hm.get(c);
            System.out.println(values);
            hm.put(c, values + 1);
        } else {
            hm.put(c, 1);
        }
    }
    return hm;
}複製程式碼

相關文章