栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java集合简单了解——基于JDK1.8中LinkedHashMap、TreeMap、Hashtable、Properties的实现原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java集合简单了解——基于JDK1.8中LinkedHashMap、TreeMap、Hashtable、Properties的实现原理

文章目录:

1.linkedHashMap

1.1 源码中的注释部分

2.TreeMap

3.Hashtable

4.Properties


 

1.linkedHashMap

1.1 源码中的注释部分
* 

Hash table and linked list implementation of the Map interface, * with predictable iteration order. This implementation differs from * HashMap in that it maintains a doubly-linked list running through * all of its entries. This linked list defines the iteration ordering, * which is normally the order in which keys were inserted into the map * (insertion-order). Note that insertion order is not affected * if a key is re-inserted into the map. (A key k is * reinserted into a map m if m.put(k, v) is invoked when * m.containsKey(k) would return true immediately prior to * the invocation.)

从注释中,我们可以先了解到 linkedHashMap 是通过哈希表和链表实现的,它通过维护一个链表来保证对哈希表迭代时的有序性,而这个有序是指键值对插入的顺序。另外,当向哈希表中重复插入某个键的时候,不会影响到原来的有序性。也就是说,假设你插入的键的顺序为 1、2、3、4,后来再次插入 2,迭代时的顺序还是 1、2、3、4,而不会因为后来插入的 2 变成 1、3、4、2。(但其实我们可以改变它的规则,使它变成 1、3、4、2)

linkedHashMap 的实现主要分两部分,一部分是哈希表,另外一部分是链表。哈希表部分继承了 HashMap,拥有了 HashMap 那一套高效的操作,所以我们要看的就是 linkedHashMap 中链表的部分,了解它是如何来维护有序性的。

linkedHashMap 的大致实现如下图所示,当然链表和哈希表中相同的键值对都是指向同一个对象,这里把它们分开来画只是为了呈现出比较清晰的结构。

下面我们来看一下关于linkedHashMap的声明代码:

public class linkedHashMap extends HashMap implements Map

从上面的声明中,我们可以看见 linkedHashMap 是继承自 HashMap 的,所以它已经从 HashMap 那里继承了与哈希表相关的操作了,那么在 linkedHashMap 中,它可以专注于链表实现的那部分,所以与链表实现相关的属性如下。


//头指针
transient linkedHashMap.Entry head;

//尾指针
transient linkedHashMap.Entry tail;

//默认为 false。当为 true 时,表示链表中键值对的顺序与每个键的插入顺序一致,也就是说重复插入键的时候,也会更新键值对的顺序
//简单来说,为 false 时,就是上面所指的 1、2、3、4 的情况;为 true 时,就是 1、3、4、2 的情况
final boolean accessOrder;
  • linkedHashMap 是 HashMap 的子类。
  • 在HashMap存储结构的基础上,使用了一对双向链表来记录添加元素的顺序。
  • linkedHashSet的底层实际上就是new了linkedHashMap,linkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致。 

2.TreeMap
  • TreeMap存储 Key-Value 对时,需要根据 key-value 对进行排序。
  • TreeMap 可以保证所有的 Key-Value 对处于 有序状态。
  • TreeSet底层使用 红黑树结构存储数据。
  • TreeMap 的 Key 的排序:

        自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException
        定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口

  • TreeMap判断 两个key 相等的标准:两个key通过compareTo()方法或者compare()方法返回0。

3.Hashtable
  • Hashtable是个古老的 Map 实现类,JDK1.0就提供了。不同于HashMap,Hashtable是线程安全的。
  • Hashtable实现原理和HashMap相同,功能相同。底层都使用哈希表结构,查询速度快,很多情况下可以互用。
  • 与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value。
  • 与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序

4.Properties
  • Properties 类是 Hashtable 的子类,该对象用于处理属性文件。
  • 由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 value 都是字符串类型。
  • 存取数据时,建议使用 setProperty(String key,String value) 方法和 getProperty(String key) 方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/281068.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号