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

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

文章目录:


1.LinkedHashMap

1.1 源码中的注释部分

2.TreeMap

3.Hashtable

4.Properties

 


1.LinkedHashMap


1.1 源码中的注释部分

* <p>Hash table and linked list implementation of the <tt>Map</tt> interface,

* with predictable iteration order.  This implementation differs from

* <tt>HashMap</tt> 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

* (<i>insertion-order</i>).  Note that insertion order is not affected

* if a key is <i>re-inserted</i> into the map.  (A key <tt>k</tt> is

* reinserted into a map <tt>m</tt> if <tt>m.put(k, v)</tt> is invoked when

* <tt>m.containsKey(k)</tt> would return <tt>true</tt> immediately prior to

* the invocation.)


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


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


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


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

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

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


//头指针
transient LinkedHashMap.Entry<K,V> head;
//尾指针
transient LinkedHashMap.Entry<K,V> tail;
//默认为 false。当为 true 时,表示链表中键值对的顺序与每个键的插入顺序一致,也就是说重复插入键的时候,也会更新键值对的顺序
//简单来说,为 false 时,就是上面所指的 1、2、3、4 的情况;为 true 时,就是 1、3、4、2 的情况
final boolean accessOrder;

·       LinkedHashMap HashMap 的子类。

·       HashMap存储结构的基础上,使用了一对双向链表来记录添加元素的顺序。

·       LinkedHashSet的底层实际上就是newLinkedHashMapLinkedHashMap 可以维护 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就提供了。不同于HashMapHashtable是线程安全的。

·       Hashtable实现原理和HashMap相同,功能相同。底层都使用哈希表结构,查询速度快,很多情况下可以互用。

·       HashMap不同,Hashtable 不允许使用 null 作为 key value

·       HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序

4.Properties


·       Properties 类是 Hashtable 的子类,该对象用于处理属性文件。

·       由于属性文件里的 keyvalue 都是字符串类型,所以 Properties 里的 key value 都是字符串类型。

·       存取数据时,建议使用setProperty(String key,String value) 方法和getProperty(String key) 方法。

相关文章
|
6月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
174 7
|
7月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
363 100
|
7月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
369 101
|
7月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
218 4
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
327 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
327 1