Map集合(Java基础、skycto JEEditor)

一、什么是Map

不同于List单列的线性结构,Java中的Map提供的是一种双列映射的存储集合,它能够提供一对一的数据处理能力,双列中的第一列我们称为key,第二列就是value,一个key只能够在一个Map中出现最多一次,通过一个key能够获取Map中唯一一个与之对应的value值,正是它的这种一对一映射的数据处理关系,在实际应用中可以通过一个key快速定位到对应的value

Map的三个特点:

  1. 包含键值对

  2. 键唯一

  3. 键对应的值唯一

二、Map集合常用的遍历方式

遍历Map集合的常用方式有三种:

使用keySet的方式

使用entrySet的方式

使用values()取值的方式

这三种方式中,都有对应的for循环遍历和Iterator遍历的方式取值。

keySet是键的集合,Set里面的类型即key的类型;

entrySet是键-值对的集合,Set里面的类型是Map.Entry,Entry是一个键-值对;

keySet():迭代后只能通过get()取key

entrySet():迭代后可以e.getKey(),e.getValue()取key和value,返回的是Entry接口;

三、遍历的性能对比

for each与显示调用Iterator等价,除了第三种方式(for each map.keySet()),再调用get获取方式外,其他三种方式性能相当。本例还是hash值散列较好的情况,若散列算法较差,第三种方式会更加耗时。

1、在数据元素的数量比较大时,entrySet()方式的遍历效率快于keySet(),有两个原因

(1)一个原因是keySet相当于遍历了2次,一次是对key的Set集合的遍历,二次是每次遍历过程都要通过key和map.get(key)来获取value值。

(2)第二个原因是map.get(key)的时候,底层是根据key的hashCode值经过哈希算法得到一个hash值,然后作为索引映射到对应的table数组的索引位置,这是一次密集型计算,很耗费CPU,如果有大量的元素,则会使CPU使用率飙升,影响响应速度,而entrySet()返回的set里面的元素都是Map.Enpty类型,key和value就是这个类的一个属性,entry.getKey()和entry.getValue()效率肯定很高。

2、不过,在数据元素的数量比较小的情况小,keySet()方式的遍历效率快于entrySet()

3、values()是返回Map的所有value的集合的Collection,只能遍历到value,很难遍历到key,所以一般不用,如果当我们只需要取得value值时,采用values来遍历效率更高。

4、从上面的几种方式的for循环遍历和Iterator遍历的方式耗时结果来看,Iterator遍历的效率会比for循环效率更快一点。

posted @ 2019-09-15 20:13  书写人生-sky  阅读(167)  评论(0编辑  收藏  举报