博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中HashMap、TreeMap和LinkedHashMap的比较
阅读量:5240 次
发布时间:2019-06-14

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

前言

1. HashMap中k的值没有顺序,常用来做统计。

2.LinkedHashMap吧。它内部有一个链表,保持Key插入的顺序。迭代的时候,也是按照插入顺序迭代,而且迭代比HashMap快。

3. TreeMap的顺序是Key的自然顺序(如整数从小到大),也可以指定比较函数。但不是插入的顺序。

4.Hashtable与 HashMap类似,它继承自Dictionary类、不同的是:它不允许记录的键或者值为空;它支持线程的同步、即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

 

HashMap

  HashMap的底层数据结构是 “数组 + 链表”,HashMap的方法不是同步的允许key和value为null的情况。

  HashMap存储的数据是无序的,存放的顺序和取出的顺序不一致。

  特点:

  ① HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值、具有很快的访问速度;

  ② 遍历时、取得数据的顺序是完全随机的;

  ③ HashMap最多只允许一条记录的键为Null;

  ④ 允许多条记录的值为 Null;

  ⑤ HashMap不支持线程的同步、即任一时刻可以有多个线程同时写HashMap;

  ⑥ 可能会导致数据的不一致、如果需要同步、可以用 Collections的synchronizedMap方法使HashMap具有同步的能力、或者使用ConcurrentHashMap。

public static void noOrder() {        System.out.println("------无序(随机输出)------");        Map map = new HashMap();        map.put("1", "Level 1");        map.put("2", "Level 2");        map.put("3", "Level 3");        map.put("4", "Level 4");        map.put("F", "Level F");        map.put("Q", "Level Q");        Iterator it = map.entrySet().iterator();        while (it.hasNext()) {            Map.Entry e = (Map.Entry) it.next();            System.out.println("Key: " + e.getKey() + ";   Value: "                    + e.getValue());        }    }

运行结果:

------无序(随机输出)------Key: 1;   Value: Level 1Key: Q;   Value: Level QKey: 2;   Value: Level 2Key: 3;   Value: Level 3Key: 4;   Value: Level 4Key: F;   Value: Level F

 

LinkedHashMap

  LinkedHashMap 是HashMap的一个子类。LinkedHashMap 拥有 HashMap 的所有特性,它比 HashMap 多维护了一个双向链表,因此可以按照插入的顺序从头部或者从尾部迭代,是有序的,不过因为比 HashMap 多维护了一个双向链表,它的内存相比而言要比 HashMap 大,并且性能会差一些,但是如果需要考虑到元素插入的顺序的话, LinkedHashMap 不失为一种好的选择。

public static void linkedHashMap() {
System.out.println("------有序(根据输入的顺序输出)------"); Map map = new LinkedHashMap(); map.put("F", "Level F"); map.put("7", "Level 1"); map.put("8", "Level 2"); map.put("4", "Level 3"); map.put("4", "Level 4"); map.put("Q", "Level Q"); map.put("E", "Level E"); Iterator it = map.entrySet().iterator(); while (it.hasNext()) {
Map.Entry e = (Map.Entry) it.next(); System.out.println("Key: " + e.getKey() + "; Value: " + e.getValue()); } }

运行结果:

------有序(根据输入的顺序输出)------

Key: F; Value: Level F
Key: 7; Value: Level 1
Key: 8; Value: Level 2
Key: 4; Value: Level 4
Key: Q; Value: Level Q
Key: E; Value: Level E

 

TreeMap

  

  与 HashMap 不同, TreeMap 的底层就是一颗红黑树,它的 containsKey , get , put and remove 方法的时间复杂度是 log(n) ,并且它是按照 key 的自然顺序(或者指定排序)排列,与 LinkedHashMap 不同, LinkedHashMap 保证了元素是按照插入的顺序排列。

  TreeMap取出来的是排序后的键值对。但如果您要按自然顺序(字典顺序),那么TreeMap会更好。

public static void hasOrder() {        System.out.println("------有序(但是按默认顺充,不能指定)------");        Map map = new TreeMap();        map.put("F", "Level F");        map.put("7", "Level 1");        map.put("8", "Level 2");        map.put("4", "Level 3");        map.put("4", "Level 4");        map.put("Q", "Level Q");        map.put("E", "Level E");        Iterator it = map.entrySet().iterator();        while (it.hasNext()) {            Map.Entry e = (Map.Entry) it.next();            System.out.println("Key: " + e.getKey() + ";   Value: "                    + e.getValue());        }    }

运行结果:

------有序(但是按默认顺充,不能指定)------Key: 4;   Value: Level 4Key: 7;   Value: Level 1Key: 8;   Value: Level 2Key: E;   Value: Level EKey: F;   Value: Level FKey: Q;   Value: Level Q

 

 

转载于:https://www.cnblogs.com/yin1361866686/p/11046608.html

你可能感兴趣的文章
Lucene系列一:搜索引擎核心理论
查看>>
MVC3删除主表时自动删除从表中相关信息的方法
查看>>
Cannot Change Opencv Webcam Setting
查看>>
南传法句经(摘选)01
查看>>
Oracle数据库和客户端字符集
查看>>
CSS中怎么让DIV居中
查看>>
看一段Delphi导出到Word的源代码
查看>>
Dockerfile的编写(主观汇聚篇)
查看>>
MySQL在控制台上以竖行显示表格数据
查看>>
分享一个linux系统中采用嵌套for循环比较两个数组内容,并输出相同值的shell脚本...
查看>>
CentOS7linux系统安装fpm服务,自己制作rpm包文件
查看>>
SimpleXML概述
查看>>
企业QQ 增加在线交谈链接
查看>>
也说new
查看>>
Windows 8本地化多语言支持
查看>>
Oracle——多表查询
查看>>
POJ 1321
查看>>
常用设计原则(精华篇)
查看>>
java 基础 -- javassist
查看>>
java框架-15spring4_mybatis04-EHcahce-logback
查看>>