Map 接口
定义
Map<K,V> -> Mapping(绘制…的地图;提供信息)
存储是一个个的 键值对 数据(例:钥匙 与 锁),将键映射到值的对象。Map不能包含重复的键;每个键最多可以映射一个值。
Map集合的键(key)不可重复(为Set的 HashSet 与 TreeSet 提供了不可重复的键)
方法
- keyset() :返回映射中包含的键的set视图(即返回一个 set 集合)
- get(key):提供参数 key 获取值
- clear():清空
- put(K key,V value) : 通过一个 key 存储 一个 值(如果添加操作产生了替换,就会返回旧值,无替换则返回null)
- remove(key) : 可以通过 单参key(返回key对应的值即 删除返回) 或者双参 key 与 value删除(全部匹配才能删除)
- containsKey() : 判断是否有此键
- containsValue() : 判断是否有此值
- replace(key,value) : 根据键替换值,put也可以替换
- size() : 返回键值对的数量
- values() :返回只含有值的collection集合
HashMap
定义
-
对象数组 + 链表(红黑树):(哈希桶默认数量16即数组长度;散列因子0.75 即当75%的桶已经有数据时,翻倍扩容;)
数组下标 = hashCodef()返回的值 % 数组长度
链表 = 所有数组小标相同的数据(哈希桶即数组中的一个链表:数据量大于8 时转换为红黑二叉树,小于6 时又会转换为链表) -
hashCode():
返回:int 值; 对象的值相同时返回的 hash 值应不同
优点:支持散列表 -
合理设置初始容量与散列因子可以提高性能:初始容量与散列因子 次数减少散列重建Hash的过程;散列因子 影响数据查找的效率
TreeMap & LinkedHsahMap
Tree
使用方法和 HashMap 基本一致
有自然排序(或自定义排序)的存储
当用TreeSet存储自定义的数据时 需要写出存储的排序规则Comparable 或者使用Comparator
Linked
按照输入顺序排序的链表Map程序
Map的实例
简单存储
HashMap<String,String> data = new HashMap<>();
data.put("key1","锄禾日当午");
data.put("key2","汗滴禾下土");
//打印的结果为两个key 即对应的值
for (String s:data.keySet()) {
System.out.println(s + "->" + data.get(s));
}
存储自定义存储对象
当自定义储存的对象为键时,不能进行更改!
原理:
对象的 Hash 值由储存的属性值计算得来,当用 HashMap 进行存储时,会根据Hash值进行散列,当属性值更改之后,hash 值产生变化,找不到原来存储的位置。
(Hash)Map 的子集及其区别
区别在于线程安全与否
HashMap
线程不安全,效率高
HashTable
线程安全,效率低
ConcurrentHashMap
采用分段锁机制,保证线程安全,效率又高