從圖中可知 Collection是 List,Set,Quene 的根接口,Map 是另外一個接口 Iterator用於遍歷集合中元素的接口java
下面是各集合的特性數據庫
集合名 | 是否有序 | 是否容許元素重複 |
---|---|---|
Liist | 否 | 是 |
HashSet | 否 | 否 |
TreeSet | 是(二叉排序樹) | 否 |
HashMap | 否 | key惟一,value可重複 |
TreeMap | 是(二叉排序樹) | 同上 |
[集合類特色]安全
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); }
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry<Integer, Integer> entry = entries.next(); System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); }
TreeMap<User, Object> tMap = new TreeMap<>(new Comparator<User>() { @Override public int compare(User o1, User o2) { // TODO Auto-generated method stub return o1.getAge() == o2.getAge() ?0:(o1.getAge()>o2.getAge()?1:-1); } });
HashMap 在新版jdk8 中,在數據量大的時候不會採用hash方法哈希key,會採用b-tree,就和如今數據庫採用b-tree的緣由同樣,當數據量過大的時候,hash會形成大多數數據hash值同樣,再作偏移處理,反而影響性能。微信
通常集合的加載因子爲0.75 ArrayList 初始化容量爲10ide
HashMap 初始化容量爲16 即便你初始化的時候指定一個值去初始化容量 其值也不必定是你指定的那個值,其必定是2的冪次方,代碼以下性能
static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }
HashMap 和 HashTable 、ConcurrentHashMap 區別 - HashTable和ConcurrentHashMap 是線程安全的,如今主要用 後者 - HashTable key值不支持null ,其餘支持爲null - HashTable 是所有都用的synchronized 加鎖,而ConcurrentHashMap使用的分段鎖,並且在讀取value不加鎖,用的是Segment鎖(實際上是一種ReentrantLock鎖)線程
LinkedList 和 ArrayList3d
歡迎關注個人微信公衆號cobs-snail,讓咱們一塊兒前進吧!!code