1. 程式人生 > >集合(1)

集合(1)

1.迭代器,使用next()獲得序列中的下一個元素,使用hasNext()檢查序列中是否還有元素,可以理解為iterator()返回一個指向第一個元素前面位置的指標。除了 map 系列的集合,我們都能通過迭代器來對集合中的元素進行遍歷

List<String> list = new ArrayList<>();
list.add("Tom");
list.add("Bob");
list.add("Marry");
Iterator itt = null;
itt = list.iterator();
while (itt.hasNext()) {
    String obj = (String)itt.next();
    System.out.println(obj);
}

2.Collection:List 介面, Set 介面,Queue介面的父介面

List :有序,可以重複的集合。繼承於 Collection 介面

  

List 介面的三個典型實現:

  ①、List list1 = new ArrayList();

    底層資料結構是陣列,查詢快,增刪慢;執行緒不安全,效率高

   ②、List list2 = new Vector();

    底層資料結構是陣列,查詢快,增刪慢;執行緒安全,效率低,幾乎已經淘汰了這個集合

   ③、List list3 = new LinkedList();

    底層資料結構是連結串列,查詢慢,增刪快;執行緒不安全,效率高

Set介面

1、Set hashSet = new HashSet();

  ①HashSet無序;不可重複;不是執行緒安全的;集合元素可以為 NULL;

2、Set linkedHashSet = new LinkedHashSet();

  ①、不可以重複,有序(遍歷時按插入順序);集合元素可以為 NULL;

  因為底層採用 連結串列 和 雜湊表的演算法。連結串列保證元素的新增順序,雜湊表保證元素的唯一性

3、Set treeSet = new TreeSet();

  TreeSet:有序(遍歷時按大小);不可重複,底層使用 紅黑樹演算法,擅長於範圍查詢。

  *  如果使用 TreeSet() 無引數的構造器建立一個 TreeSet 物件, 則要求放入其中的元素的類必須實現 Comparable 介面,所以在其中不能放入 null 元素

Queue介面 https://www.cnblogs.com/lemon-flm/p/7877898.html

優先佇列 Queue<User> queue=new PriorityQueue<>(),有序(按大小),不能為null

       poll         移除並返問佇列頭部的元素    如果佇列為空,則返回null
  peek       返回佇列頭部的元素             如果佇列為空,則返回null

Map介面常用類

(1)HashMap,無序,key可以為null;

(2)TreeMap,有序列(遍歷時按key大小),key不可以為null;

(3)LinkedHashMap,有序列(遍歷時按插入順序),key可以為null;

(4)Hashtable,被淘汰的,key不可以為null,執行緒安全,效率低

(5)CurrentHashMap,執行緒安全,無序,key不可以為null(別問為什麼,因為別人程式裡沒考慮,而HashMap考慮了)。

3.自定義類比較器的使用

(1)內部比較器:實現Comparable介面, 重寫conpareTo方法

(2)外部比較器:實現Comparator介面, 定義comparator比較類

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;

class User implements Comparable<User>{
    private int x,y;
    User(int x,int y){
        this.x=x;
        this.y=y;
    }
    @Override
    public int compareTo(User o) {
        return (x>o.x)||(x==o.x && y>o.y)?1:-1;
    }
    @Override
    public String toString() {
        return "User{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }
    static class Com implements Comparator<User>{

        @Override
        public int compare(User o1, User o2) {
            return (o1.x<o2.x)||(o1.x==o2.x&&o1.y<o2.y)?1:-1;
        }
    }
}
public class Test {
    public static void main(String[] args){
        //Queue<User> queue=new PriorityQueue<>();    //內部比較器
        Queue<User> queue=new PriorityQueue<>(new User.Com());    //外部比較器
        queue.add(new User(3,5));
        queue.add(new User(3,2));
        queue.add(new User(3,7));
        queue.add(new User(1,100));
        queue.add(new User(4,1));
        for (;queue.size()>0;){
            System.err.println(queue.poll());
        }
    }

}

4.set底層使用map實現的。因為null不能比較,所以TreeMap,TreeSet,PriorityQueue這些要比較的key不能為null,還有一個CurrentHashMap key也不能為null,保證有序的集合有LinkHashSet,TreeSet,LinkedHashMap,TreeMap。通過一個雙向連結串列實現有序。對於採用hashset和hashmap的自定義類,一般都要重寫hashcode和equals,不然就沒有去重的效果了,不重寫預設比較地址。

https://www.cnblogs.com/ysocean/p/6555373.html