20.集合
1. Map
HashSet和TreeSet: Null的问题: tree类型不可以有NULL
Map: 映射 一堆 key,value组成的: key有唯一型。value可重复
-
boolean containsKey(K key); 是否包含这个key
-
Set<Entry<K, V>> entrySet();
获取entry组成, 去重,无序 -
Collection values(); value组成的集合
-
Set keySet: key组成的集合
-
V get(key); 根据Key获取Value
-
V put(key, value); 往Map添加一个 key,value。 key存在是覆盖
-
V remove(key); 根据key删除 key,value
-
int size(); 获取key,value的个数
2. HashMap:无序去重映射
HashSet封装的HashMap。 key的去重和无序 和hashset一样
Map<String, String> map = new HashMap<String, String>();
map.put("002", "日本"); // put添加一个k,v
map.put("001", "中国");
map.put("003", "韩国");
System.out.println(map.size()); // 3
if (map.containsKey("001")) { // 是否包含
System.out.println("---");
}
map.put("003", "印度"); // 去重 对象类型怎么去重:
System.out.println(map.size()); // 3
System.out.println(map.get("003")); // 根据key获取value
map.forEach((k, v) -> System.out.println(k + "@" + v)); // jdk8的遍历
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String t, String u) {
System.out.println(t + "@" + u);
}
});
三种遍历方式:
3. TreeMap: 有排序,去重
去重:和排序: 根据Comparable的compareTo()确定。
TreeSet - 基于Treemap
package com.etc.lesson21;
import java.util.Map;
import java.util.TreeMap;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.ToString;
public class TestMain3 {
public static void main(String[] args) {
// TreeSet tree = new TreeSet();
// tree.add(new A());
//
Map<A, String> map = new TreeMap<>();
map.put(new A(3), "11");
map.put(new A(1), "222");
map.put(new A(2), "333");
map.put(new A(0), "444");
System.out.println();
System.out.println(map.size());
map.forEach((k, v) -> System.out.println(k + "@" + v));
}
}
@ToString
@AllArgsConstructor
@NoArgsConstructor
class A implements Comparable<A>{
private int age;
public int compareTo(A o) {
return this.age - o.age;
}
}
4. HashMap和 HashTable
HashTable: 线程安全, 有下标, key和value都不可以为NULL
HashMap: 线程非安全:::????
- Collections.synchronizedMap|List(); 傻瓜式加同步锁sync锁
- CAS-ConcurrentHashMap: 多种锁。比上面快: syn锁+reetrantlock+atomic
HashMap: 的实现;
-
16
-
0.75 ; 数组的扩容到13的时候开始扩容
-
8
-
6
-
数组:通过f(key) =hash % 16
-
单向链表: f(key) =hash % 16 相同的时候
-
红黑树: 添加当节点数到 8的时候, 删除的到6变回 单向链表