博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Map,HashMap,LinkedHashMap,TreeMap比较和理解
阅读量:5159 次
发布时间:2019-06-13

本文共 5077 字,大约阅读时间需要 16 分钟。

/*

 * 获取功能:
 * V get(Object key):根据键获取值
 * Set<K> keySet():获取集合中所有键的集合
 * Collection<V> values():获取集合中所有值的集合
 */

Map
map = new HashMap
(); // 创建元素并添加元素 map.put("邓超", "孙俪"); map.put("黄晓明", "杨颖"); map.put("周杰伦", "蔡依林"); map.put("刘恺威", "杨幂"); // V get(Object key):根据键获取值 System.out.println("get:" + map.get("周杰伦")); System.out.println("get:" + map.get("周杰")); // 返回null System.out.println("----------------------"); // Set
keySet():获取集合中所有键的集合 Set
set = map.keySet(); for (String key : set) { System.out.println(key); } System.out.println("----------------------"); // Collection
values():获取集合中所有值的集合 Collection
con = map.values(); for (String value : con) { System.out.println(value); }

遍历

// 遍历        // 获取所有的键        Set
set = map.keySet(); // 遍历键的集合,获取得到每一个键 for (String key : set) { // 根据键去找值 String value = map.get(key); System.out.println(key + "---" + value); }

另一种方式遍历

Set
> set = map.entrySet(); // 遍历键值对对象的集合,得到每一个键值对对象 for (Map.Entry
me : set) { // 根据键值对对象获取键和值 String key = me.getKey(); String value = me.getValue(); System.out.println(key + "---" + value); }

当数据量大的时候,采用entrySet遍历key+value的效率要高于keySet(比较效率https://blog.csdn.net/zhangsify/article/details/52966094)

//---------------------------------------------------------------------------------------------------------------------

/*

 * HashMap:是基于哈希表的Map接口实现。
 * 哈希表的作用是用来保证键的唯一性的。
 *
 * HashMap<String,String>
 * 键:String(不允许重复)
 * 值:String(允许重复)
 */

 

HashMap
hm = new HashMap
(); hm.put("it001", "马云"); hm.put("it003", "马化腾"); hm.put("it004", "乔布斯"); hm.put("it005", "张朝阳"); hm.put("it002", "裘伯君"); // wps hm.put("it001", "比尔盖茨"); // 遍历 Set
set = hm.keySet(); for (String key : set) { String value = hm.get(key); System.out.println(key + "---" + value); }

 

结果

it004---乔布斯it003---马化腾it005---张朝阳it002---裘伯君it001---比尔盖茨

这里为什么键it001有两个选取最后一个 ,最后一个覆盖前面一个键

//================================================================================

 

/*

 * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
 * 由哈希表保证键的唯一性
 * 由链表保证键盘的有序(存储和取出的顺序一致)
 */

 

LinkedHashMap
hm = new LinkedHashMap
(); // 创建并添加元素 hm.put("2345", "hello"); hm.put("1234", "world"); hm.put("3456", "java"); hm.put("1234", "javaee"); hm.put("3456", "android"); // 遍历 Set
set = hm.keySet(); for (String key : set) { String value = hm.get(key); System.out.println(key + "---" + value); }

 

TreeMap

TreeMap
tm = new TreeMap
( new Comparator
() { @Override public int compare(Student s1, Student s2) { // 主要条件 int num = s1.getAge() - s2.getAge(); // 次要条件 int num2 = num == 0 ? s1.getName().compareTo( s2.getName()) : num; return num2; } }); // 创建学生对象 Student s1 = new Student("潘安", 30); Student s2 = new Student("柳下惠", 35); Student s3 = new Student("唐伯虎", 33); Student s4 = new Student("燕青", 32); Student s5 = new Student("唐伯虎", 33); // 存储元素 tm.put(s1, "宋朝"); tm.put(s2, "元朝"); tm.put(s3, "明朝"); tm.put(s4, "清朝"); tm.put(s5, "汉朝"); // 遍历 Set
set = tm.keySet(); for (Student key : set) { String value = tm.get(key); System.out.println(key.getName() + "---" + key.getAge() + "---" + value); }
潘安---30---宋朝燕青---32---清朝唐伯虎---33---汉朝柳下惠---35---元朝

//=========================================

HashMap

  • 它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。遍历时,取得数据的顺序是完全随机的(键唯一,取随机)

 

  • HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null(键可一null,值为所谓)
  • HashMap不支持线程的同步(即任一时刻可以有多个线程同时写HashMap),可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap
  • Hashtable与 HashMap类似,它继承自Dictionary类。不同的是:它不允许记录的键或者值为空;它支持线程的同

LinkedHashMap

  • LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。也可以在构造时带参数,按照应用次数排序。

TreeMap

  • TreeMap实现SortMap接口,能够把它保存的记录根据键排序

使用方式

  • 一般情况下,我们用的最多的是HashMap。HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
  • TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
  • LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。

 

转载于:https://www.cnblogs.com/G-JF/p/9322207.html

你可能感兴趣的文章
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
多表查询
查看>>
单表查询
查看>>
网络并发 数据库可能的面试题
查看>>
mysql 之多表查询
查看>>
高大上版解决粘包问题
查看>>
前端之BOM和DOM
查看>>
前端之JS
查看>>
前端之BootStrap
查看>>
前端之jQuery
查看>>
HTML 前端
查看>>
pycharm 导入 新安装 moudle
查看>>
ES使用text类型字段排序报错
查看>>
Core源码(二) Linq的Distinct扩展
查看>>
Core源码(三) Lazy<T>
查看>>
分库情况下的数据库连接注入
查看>>
Spring MVC
查看>>
AFO以后的机房游记
查看>>