[Java] TreeMap、HashMap、LindedHashMap的区别

版权声明:请尊重个人劳动成果,转载注明出处,谢谢!

Map家族的继承关系

1 . TreeMap

TreeMap实现SortMap接口,能够把它保存的记录根据键排序, 默认是按键值的升序排序(自然顺序),也可以指定排序的比较器( Comparator ),当用Iterator 遍历TreeMap时,得到的记录是排过序的。

注意,此实现不是同步的。如果多个线程同时访问一个映射,则其必须 外部同步。这一般是通过对自然封装该映射的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSortedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的不同步访问,如下所示:

 SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

2 .HashMap

键和值都可以是空对象 
不保证映射的顺序,多次访问,映射元素的顺序可能不同 
非线程安全

3 .LinkedHashMap

内部维持了一个双向链表,可以保持顺序

此实现不是同步的。如果多个线程同时访问链接的哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射的意外的非同步访问:

  Map m = Collections.synchronizedMap(new LinkedHashMap(...));

LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

4 .使用场景

一般情况下,我们用的最多的是HashMap 
HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。

在Map 中插入、删除和定位元素,HashMap 是最好的选择。

TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。

时间: 2024-11-03 00:42:15

[Java] TreeMap、HashMap、LindedHashMap的区别的相关文章

Java中HashMap和TreeMap的区别深入理解_java

首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 TreeMap 非线程安全 线程安全 在Java里,线程安全一般体

Java基础-18总结Map,HashMap,HashMap与Hashtable区别,Collections工具类

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:Map(掌握) (1)将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.  (2)Map和Collection的区别? A:Map 存储的是键值对形式的元素,键唯一,值可以重复.夫妻对

Java中Hashtable类与HashMap类的区别详解_java

Hashtable类 Hashtable继承Map接口,实现一个key-value映射的哈希表.任何非空(non-null)的对象都可作为key或者value. 添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数. Hashtable通过initial capacity和load factor两个参数调整性能.通常缺省的load factor 0.75较好地实现了时间和空间的均衡.增大load factor可以节省空间但相应的查找时间将增大,

二叉树-Java treemap集合类,自定义比较器怎样实现逆字典顺序输出的?

问题描述 Java treemap集合类,自定义比较器怎样实现逆字典顺序输出的? 代码是: import java.util.*; public class Example21 { // 创建TreeMap测试类 public static void main(String[] args) { TreeMap tm = new TreeMap(new MyComparator());// 传入一个自定义比较器 tm.put("1", "Jack"); // 向集合存

java.utils.HashMap数据结构分析(转)

  上图为Hashmap的数据结构图,具体实线是采用数组结合链表实现,链表是为了解决在hash过程中因hash值一样导致的碰撞问题. 所以在使用自定义对象做key的时候,一定要去实现hashcode方法,不然hashmap就成了纯粹的链表,查找性能非常的慢,添加节点元素也非常的慢.如 import java.util.HashMap; import java.util.Map; public class User { private String username; public boolean

Javascript实现Java的HashMap(链表散列)

前言 如果你研究过Java中HashMap的源码,你就会知道HashMap底层的存储结构.Java中的HashMap是以链表散列的形式存储的,也就是数组+链表:HashMap中有一个Entry数组,默认的数组长度是16.这个值必须是2的整数次幂,以保证在通过key的hash值来计算entry应该放置的数组下标时可以尽量做到平均分配.而Entry数组中的每一个非空Entry都是一个Entry链表的头结点.这样做的好处就是HashMap结合了数组在寻址(查找)上的优势和链表在放置和删除上的优势.当一

字符串-java中String str1…的区别,详细见内容

问题描述 java中String str1-的区别,详细见内容 String str1,str2; str1 = "we are friends"; str2 = "we are friends"; 和 String str1 = "we are friends"; String str2 = "we are friends"; 在内存上的区别是什么? 是否有区别? 解决方案 没有区别,他们指向同一个对象 解决方案二: 就最后

java类的问题-关于java中的方法的区别

问题描述 关于java中的方法的区别 我是java菜鸟,想问一个问题关于 public static void main (String [] args){} 和static public void main (String [] args){} 的区别是什么?在jvm中是如何执行的? 解决方案 应该是没区别的吧 你要看区别 先分别编译后 后看看编译后的内容的区别吧 很多代码经过编译后效果是一样的

聊聊 Java 中 HashMap 初始化的另一种方式

如果你接触过不同的语言,从语法和代码层面来说,Java 是一种不折不扣的"臃肿.啰嗦"的语言,从另一方面来说这种臃肿和啰嗦也体现了它严谨的一面,作为适合构建大型.复杂项目的理由之一. 1.HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器.普通青年一般会这么初始化: HashMap<String, String> map = new HashMap<String, String>(); map.p

java,javacript和jsp的区别

问题描述 各位仁兄,想请教下java,javacript和jsp的区别.因小弟最近初学javacript,这三方面的内容都涉及到,望好心的仁兄不吝赐教,谢谢! 解决方案 解决方案二:java:基本的语言,通常说j2sejavascript:浏览器脚本语言jsp:java服务端页面,允许你在上面写java代码创建动态页面解决方案三:引用1楼ylz2007的回复: java:基本的语言,通常说j2sejavascript:浏览器脚本语言jsp:java服务端页面,允许你在上面写java代码创建动态页