建手机网站的必要性,系统开发的可行性分析,wordpress 快速建站,搜索引擎营销的特征通过之前的学习我们知道Map是一个双列集合#xff0c;就是以键值对的形式进行数据存储 java进阶—集合
Map 下面有 三个子接口#xff0c;HashMap #xff0c; HashTable 以及 TreeMap
提醒一点#xff1a;Map不是Collection下的集合#xff0c;Collection是单列集合就是以键值对的形式进行数据存储 java进阶—集合
Map 下面有 三个子接口HashMap HashTable 以及 TreeMap
提醒一点Map不是Collection下的集合Collection是单列集合List,Set
Map 的存储方式跟 list ,set 是不一样的先来看看他的基本结构长什么样 MapString,String resultMap new HashMap(3);泛型里面贴的标签是 键值对的类型 键值 括号里面的3 是设置这个Map 容器的大小 开发中一定要设置map的初始化大小具体多少按需求而定
接下来我们一个一个来看
HashMap
可以说HashMap在开发中最常用代码中随处可见创建也很简单new 一个 一样的集合创造出来了不用就浪费了
添加put
MapString,String resultMap new HashMap(3);resultMap.put(1号,去玩);resultMap.put(2号,去吃);resultMap.put(3号,睡觉);移除remove
remove 是根据key 移除 value MapString, String resultMap new HashMap(3);resultMap.put(1号, 去玩);resultMap.put(2号, 去吃);resultMap.put(3号, 睡觉);resultMap.remove(1号);是否存在这个KeycontainsKey
MapString, String resultMap new HashMap(3);resultMap.put(1号, 去玩);resultMap.put(2号, 去吃);resultMap.put(3号, 睡觉);boolean flag resultMap.containsKey(3号);System.out.println(flag);是否存在这个ValuecontainsValue MapString, String resultMap new HashMap(3);resultMap.put(1号, 去玩);resultMap.put(2号, 去吃);resultMap.put(3号, 睡觉);boolean flag resultMap.containsValue(上班);System.out.println(flag);4. 判断集合是否为空isEmpty MapString, String resultMap new HashMap(3);resultMap.put(1号, 去玩);resultMap.put(2号, 去吃);resultMap.put(3号, 睡觉);boolean flag resultMap.isEmpty();System.out.println(flag);5. 获取集合大小size
MapString, String resultMap new HashMap(3);resultMap.put(1号, 去玩);resultMap.put(2号, 去吃);resultMap.put(3号, 睡觉);int size resultMap.size();System.out.println(size);6. 遍历
map集合遍历这边介绍三种方式
entrySet 推荐使用 for (Map.EntryString, String entry : resultMap.entrySet()) {System.out.println(entry.getKey()entry.getValue());}keySet (不要使用效率很低) MapString, String resultMap new HashMap(3);resultMap.put(1号, 去玩);resultMap.put(2号, 去吃);resultMap.put(3号, 睡觉);for (String s : resultMap.keySet()) {System.out.println(keys....valueresultMap.get(s));}jdk1.8 forEach MapString, String resultMap new HashMap(3);resultMap.put(1号, 去玩);resultMap.put(2号, 去吃);resultMap.put(3号, 睡觉);resultMap.forEach((k, v) - {System.out.println(k...v);});我们来做个实验看看哪种遍历效率更高
我们先造100W的数据
int count 1000000;long start System.currentTimeMillis();MapString, String resultMap new HashMap(count);for (int i 1; i count; i) {resultMap.put(i , i --- map);}//效率对比,装载Map耗时System.out.println(装载map耗时 (System.currentTimeMillis()-start) ms);//用entrySetstart System.currentTimeMillis();for (Map.EntryString, String entry : resultMap.entrySet()) {String key entry.getKey();String value entry.getValue();}System.out.println(用entrySet 遍历 map耗时 (System.currentTimeMillis()-start) ms);//用keySetstart System.currentTimeMillis();for (String s : resultMap.keySet()) {String key s;String value resultMap.get(s);}System.out.println(用keySet 遍历 map耗时 (System.currentTimeMillis()-start) ms);//用forEachstart System.currentTimeMillis();resultMap.forEach((k, v) - {String key k;String value v;});System.out.println(用forEach 遍历 map耗时 (System.currentTimeMillis()-start) ms);输出 可以看到entrySet效率是最高的 forEach 效率是最低的
当我们把数据调整到1000W时
int count 10000000;long start System.currentTimeMillis();MapString, String resultMap new HashMap(count);for (int i 1; i count; i) {resultMap.put(i , i --- map);}//效率对比,装载Map耗时System.out.println(装载map耗时(System.currentTimeMillis()-start) ms);//用entrySetstart System.currentTimeMillis();for (Map.EntryString, String entry : resultMap.entrySet()) {String key entry.getKey();String value entry.getValue();}System.out.println(用entrySet 遍历 map耗时(System.currentTimeMillis()-start) ms);//用keySetstart System.currentTimeMillis();for (String s : resultMap.keySet()) {String key s;String value resultMap.get(s);}System.out.println(用keySet 遍历 map耗时(System.currentTimeMillis()-start) ms);//用forEachstart System.currentTimeMillis();resultMap.forEach((k, v) - {String key k;String value v;});System.out.println(用forEach 遍历 map耗时(System.currentTimeMillis()-start) ms);输出结果 entrySet 的效率依然是最高的foreach这边效率跟entry差不多了
将数据 换成1500W
int count 15000000;long start System.currentTimeMillis();MapString, String resultMap new HashMap(count);for (int i 1; i count; i) {resultMap.put(i , i --- map);}//效率对比,装载Map耗时System.out.println(装载map耗时(System.currentTimeMillis()-start) ms);//用entrySetstart System.currentTimeMillis();for (Map.EntryString, String entry : resultMap.entrySet()) {String key entry.getKey();String value entry.getValue();}System.out.println(用entrySet 遍历 map耗时(System.currentTimeMillis()-start) ms);//用keySetstart System.currentTimeMillis();for (String s : resultMap.keySet()) {String key s;String value resultMap.get(s);}System.out.println(用keySet 遍历 map耗时(System.currentTimeMillis()-start) ms);//用forEachstart System.currentTimeMillis();resultMap.forEach((k, v) - {String key k;String value v;});System.out.println(用forEach 遍历 map耗时(System.currentTimeMillis()-start) ms);可以看到forEach的效率是最高的keySet 效率一直很低
总结 对map进行遍历建议使用 entrySet数据量很庞大千万级别建议用forEach keySet不要用
HashTable
HashTable 不建议使用就跟vector 跟arrayList 一样 其主要一个原因就是线程安全这是个优点但是它效率低
TreeMap
treeMap中的元素默认是按照key来进行自然排序的
对Integer来说其自然排序就是数字的升序
对String来说其自然排序就是按照字母表排序
主要体现在他的构造 public class TreeMapK,V
extends AbstractMapK,V
implements NavigableMapK,V, Cloneable, Serializable来看代码
TreeMapInteger, String treeMap new TreeMap();treeMap.put(1,1号);treeMap.put(7,7号);treeMap.put(6,6号);treeMap.put(3,3号);for (Map.EntryInteger, String entry : treeMap.entrySet()) {System.out.println(entry.getKey()....entry.getValue());}打印结果 【最后来一个例子加深对map集合的使用】
创建三个学生有属性姓名年龄给每个学生定义上整形编号 保存在map中并且遍历输出学生编号姓名年龄
public class Person {private String name;private Integer age;public Person(String name, Integer age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}
}
public static void main(String[] args) {MapInteger, Person treeMap new HashMap(3);treeMap.put(1,new Person(zhangsan,18));treeMap.put(3,new Person(lisi,20));treeMap.put(4,new Person(wangwu,30));for (Map.EntryInteger, Person entry : treeMap.entrySet()) {System.out.println(编号:entry.getKey(),姓名:entry.getValue().getName(),年龄:entry.getValue().getAge());}}执行结果