Map集合
现实生活中,我们常会看到这样的一种集合:IP地址与主机名,等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map
接口。
- Collection`中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
Map
中的集合,元素是成对存在的(理解为夫妻
)。每个元素由键与值两部分组成,通过键可以找对所对应的值`。- Collection中的集合称为单列集合,Map中的集合称为
双列集合
。 - 需要注意的是,
Map
中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
Map常用子类
通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合
。
- HashMap:存储数据采用的哈希表结构
,
元素的存取顺序不能保证一致`。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 - LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致`;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
Map接口中的常用方法
Map接口中定义了很多方法,常用的如下:
- public V put(K key, V value)`: 把指定的键与指定的值添加到Map集合中。
- public V remove(Object key)`: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
- public V get(Object key)` 根据指定的键,在Map集合中获取对应的值。
- boolean containsKey(Object key) ` 判断集合中是否包含指定的键。
- public Set keySet()`: 获取Map集合中所有的键,存储到Set集合中。
- public Set> entrySet()`: 获取到Map集合中所有的键值对对象的集合(Set集合)。
Map集合遍历键找值方式
键找值方式:即通过元素中的键,获取键所对应的值
分析步骤:
方式一:
1)获取所有键的集合。用keySet()方法实现 2)遍历键的集合,获取到每一个键。用增强for实现 3)根据键去找值。用get(Object key)方法实现
public class MapDemo_03 { public static void main(String[] args) { //创建集合对象 Map<String, String> map = new HashMap<String, String>(); //添加元素 map.put("灰太狼", "红太狼"); map.put("喜羊羊", "美羊羊"); map.put("扁嘴伦", "暖羊羊"); //获取所有键的集合。用keySet()方法实现 Set<String> keySet = map.keySet(); //遍历键的集合,获取到每一个键。用增强for实现 for (String key : keySet) { //根据键去找值。用get(Object key)方法实现 String value = map.get(key); System.out.println(key + "," + value); } } }
方式二:
1)获取所有键值对对象的集合:Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合 2)遍历键值对对象的集合,得到每一个键值对对象:用增强for实现,得到每一个Map.Entry 3)根据键值对对象获取键和值:用getKey()得到键,用getValue()得到值
public class MapDemo02 { public static void main(String[] args) { //创建集合对象 Map<String, String> map = new HashMap<String, String>(); //添加元素 map.put("灰太狼", "红太狼"); map.put("喜羊羊", "美羊羊"); map.put("扁嘴伦", "暖羊羊"); //获取所有键值对对象的集合 Set<Map.Entry<String, String>> entrySet = map.entrySet(); //遍历键值对对象的集合,得到每一个键值对对象 for (Map.Entry<String, String> me : entrySet) { //根据键值对对象获取键和值 String key = me.getKey(); String value = me.getValue(); System.out.println(key + "," + value); } } }
Entry键值对对象
我们已经知道,Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map中是一一对应关系,这一对对象又称做Map中的一个Entry(项)。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。
既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:
- public K getKey()`:获取Entry对象中的键。
- public V getValue()`:获取Entry对象中的值。
在Map集合中也提供了获取所有Entry对象的方法:
- public Set> entrySet()`: 获取到Map集合中所有的键值对对象的集合(Set集合)。
Map集合遍历键值对方式
键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。`
操作步骤与图解:
- 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示:entrySet()`。
- 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。
- 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示:getkey() getValue()`
• 1
测试代码如下:
• 1
结果如下:
HashMap(默认大小是16)
HashMap即是采用了链地址法来解决哈希冲突,也就是数组+链表的方式。
HashMap由数组+链表组成的,数组是HashMap的主体,**链表则是主要为了解决哈希冲突而存在的,**如果定位到的数组位置不含链表(当前entry的next指向null),那么查找,添加等操作很快,仅需一次寻址即可 。 如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
JDK1.8在JDK1.7的基础上针对增加了红黑树来进行优化。即当链表超过8时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能,其中会用到红黑树的插入、删除、查找等算法。
如果两个对象相等,则hashcode一定也是相同的
两个对象相等,对两个对象分别调用equals方法都返回true
两个对象有相同的hashcode值,它们也不一定是相等
LinkedHashMap
我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序
,还要速度快怎么办呢?
在HashMap下面有一个子类LinkedHashMap
,它是链表和哈希表组合
的一个数据存储结构## 标题。
• 1