Map 接口
存储双值(键值对)方式为:key->value key值不能重复
定义:
public interface Map<K,V>
方法:
put(K key, V value) 存放数据,如果有旧值,则替换返回旧值,反之返回null
putAll(Map<? extends K,? extends V> m) 将指定集合存入
keySet() 返回键值集合
remoce(Object key) 返回结果同put
remove(Object key, Object value)
clear() 删除所有映射
size() 返回映射数量
containsKey(Object key) 判断某个键是否在集合中
containsValue(Object value) 判断某个值是否在集合中
replace(K key, V value) 根据键替换值
values() 将所有值变成Collection集合
哈希表:
存储方式:对象数组+链表
首先用HashCode值与数组的长度进行取余,确定对象存在哪个位置
默认数组长度(哈希桶)为16
散列因子为0.75(当达到百分之75,进行扩容,扩容两倍)
如果两个对象余数一样,则启用链表,存在此下标的第二个位置,当某一个数组的某个链表(哈希桶)长度大于8,则会变成红黑树,当哈希桶长度减少到6时,会转换回链表
HashMap子类:
基于哈希表存储,不保证存储顺序
put方法流程:
方法:都也差不多
区别:
HashMap:线程不安全,
Hashtable:线程安全
ConcurrentHashMap:采用分段锁机制,保证线程安全,效率又比较高
TreeMap:不保证存储顺序,但是会自动进行排序
LinkedHashMap:为了更好的使用HashMap又能保证存储顺序
散列:
重建内部结构,进行散列时,先创建一个两倍大小的哈希表再将之前的数据存入
当键值存储自定义对象时一定要避免修改,因为方法是通过哈希值进行查找数据,修改,属性会改变原有的哈希值。
JDK 9 新特性:
创建固定长度的集合
三个接口的三个静态方法:
list: of()方法
Set: of()方法
Map: of()方法