集合(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,不然就沒有去重的效果了,不重寫預設比較地址。