- Map的种类
- Map接口主要的几个方法:
- 简单看下三者的区别:
- Map循环♻️
- 1. 使用较多 :通过key的set集合进行遍历,然后通过key来取map的value。
- 2. 将key的set集合以迭代器的方式遍历出来,然后通过key来取map的value。
- 3. 将Map的键值对以迭代器的方式遍历出来,然后通过.getKey()与.getValue()方法取k、v的值。
- 4. 直接取出map的value并放在collection中,然后将v循环遍历。
- 5.推荐:取得所有键值对来通过foreach循环,遍历出所有k、v。
Map是一种常用存储键值对的数据集合,键以散列或者树形结构进行存储;
Map的种类先区分一下map的种类,以及应用场景。
Map主要有三种类型:HashMap(常用)、TreeMap(树形结构)、LinkedHashMap(前两者的结合)
Map接口主要的几个方法:| V put(K key, V value) | 往Map中添加键值对,其中key为键,value为值;如果key存在,则覆盖原有的值;如果不存在,则新建键值对。 |
|---|---|
| V get(Object key) | 从Map中查找键key对应的值,如果没有,则返回null |
| default V getOrDefault(Object key, V defaultValue) | Map中查找键key对应的值,如果没有,则返回第二个参数(设置的默认值);这里的修饰符default是用在接口方法中,表示这个方法在接口中已经实现了,子类可以不实现(Java8开始支持) |
| Set keySet() | 返回Map中Key的集合;之所以返回Set,是因为Map中的key不能有重复,所以用Set最适合了 |
| Collection values() | 返回Map中Values的集合 |
| HashMap | TreeMap | LinkedHashMap | |
|---|---|---|---|
| 访问速度 | 快 | 慢 | 适中 |
| 元素是否有序 | 无序 有序 | 默认按key排序 有序 | 默认按插入的顺序 |
| 适用场景 | 普通的插入 | 查询(用的最多) 需要对key进行排序的场景 | 需要保证查询和插入顺序一致的场景 |
| 接口 | HashMap内部是数组+链表的结构;在添加键值对的时候,Key做了hash处理,然后按照hash值进行排列;如果hash值没有重复,就按照数组的方式依次排列;如果hash值有重复的,就添加到已有的键值对后面(Java8以后是尾部插入),形成链表结构; | 在插入的时候,可以按照键的顺序进行排序,它适合用在排序比较多的场景,性能会比HashMap差些; | 拥有HashMap的大部分优点,且保证了插入的顺序,使得在查询的时候,可以按照插入的顺序依次读取; |
总结:
Map一般用到的有HashMap,TreeMap,LinkedHashMap,并发相关的,这里入门级别的先不涉及(比如ConcurrentHashMap)
- HashMap:插入和访问都很快,但是内部是无序排列
- TreeMap:插入和访问都很慢,但是内部是有序排列,默认按key升序排列
- LinkedHashMap:拥有HashMap的大部分优点,而且还可以按照元素插入的顺序来访问元素,但是性能会比HashMap差
总结下Map取值比较常用的几种遍历方法
1. 使用较多 :通过key的set集合进行遍历,然后通过key来取map的value。Set set = map.keySet();
for (Object o : set) {
System.out.println(o+""+map.get(o));
}
2. 将key的set集合以迭代器的方式遍历出来,然后通过key来取map的value。
Set set = map.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println("key:"+next+",value:"+map.get(next));
}
3. 将Map的键值对以迭代器的方式遍历出来,然后通过.getKey()与.getValue()方法取k、v的值。
Set4. 直接取出map的value并放在collection中,然后将v循环遍历。> entries = map.entrySet(); Iterator > iterator1 = entries.iterator(); while (iterator1.hasNext()){ Map.Entry next = iterator1.next(); System.out.println("key:"+next.getKey()+",value:"+next.getValue()); }
Collection5.推荐:取得所有键值对来通过foreach循环,遍历出所有k、v。values = map.values(); for (FactoryStatus value : values) { System.out.println("value:"+value); }
Set> entries = map.entrySet(); for (Map.Entry entry : entries) { System.out.println("key:"+entry.getKey()+",value:"+entry.getValue()); }



