JAVA 集合类的认识(2)—— Map 接口

Map

  • Java 中的 Map 接口 是和 Collection 接口 同一等级的集合根接口,它表示一个键值对 (key-value) 的映射。类似数学中 函数 的概念。
  • 一个 Map 中,任意一个 key 都有唯一确定的 value 与其对应,这个 key-value 的映射就是 map。
  • Map 中元素的顺序取决于迭代器迭代时的顺序,有的实现类保证了元素输入输出时的顺序,比如说 TreeMap;有的实现类则是无序的,比如 HashMap。

Map 接口提供了三种角度分析 Map

  • KeySet
  • Values
  • Entry
KeySet

KeySet 是一个 Map 中键(key)的集合,以 Set 的形式保存,不允许重复,因此键存储的对象需要重写 equals() 和 hashCode() 方法。
可以通过 Map.keySet() 方法获得。

Set set = map.keySet();
for (Object key : set) {
    System.out.println(map.get(key));
}
Values

Values 是一个 Map 中值 (value) 的集合,以 Collection 的形式保存,因此可以重复。
可以通过 Map.values() 方法获得。

Collection values = map.values();
Iterator iterator = values.iterator();
while (iterator.hasNext()){
    System.out.println("value " + iterator.next());
}
Entry

Entry 是 Map 接口中的静态内部接口,表示一个键值对的映射

Entry 具有以下方法

  • getKey() , 获取这组映射中的键 key
  • getValue() , 获取这组映射中的值 value
  • setValue() , 修改这组映射中的值
  • hashCode() , 返回这个 Entry 的哈希值
  • equals() , 对比 key-value 是否相等

通过 Map.entrySet() 方法获得的是一组 Entry 的集合,保存在 Set 中,所以 Map 中的 Entry 也不能重复。

public Set<Map.Entry<K,V>> entrySet();
Set entrySet = map.entrySet();
for (Object o : entrySet) {
    Map.Entry entry = (Map.Entry) o;
    System.out.println(entry);
    System.out.println(entry.getKey() + " / " + entry.getValue());
}

关于 Map 类集合能不能存储 null 值

集合类KeyValue说明
HashTable不允许不允许线程安全
TreeMap不允许允许线程不安全
HashMap允许允许线程不安全
LinkedHashMap允许允许线程不安全
ConcurrentHashMap不允许不允许线程局部安全

Map 的几个主要实现类

HashTable
  • 古老,线程安全
  • 性能较差,已经不推荐使用
TreeMap
  • 有序
  • 效率比 HashMap 低
HashMap
  • 速度很快,但没有顺序
  • 线程不安全
  • 在多线程情况下在扩容的情况下可能会形成闭环链路,耗光 cpu 资源
LinkedHashMap
  • 结合 HashMap 和 TreeMap 的优点,有序的同时效率也不错,仅比 HashMap 慢一点
  • 多了一个链表来维护元素插入的顺序吗,遍历效率会高于HashMap
ConcurrentHashMap
  • 线程安全
  • 取消了 Segment 分段锁的数据结构( jdk1.7 ),取而代之的是数组+链表(红黑树)的结构( jdk1.8 )
  • 查询的时间复杂度:O(logN)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值