hashMap的底层数据结构:数组+链表
来源:互联网 发布:阿里云 bd 待遇 编辑:程序博客网 时间:2024/06/03 15:00
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存、取value。
数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。
数组
数组存储区间连续,占用内存比较严重,空间复杂度很大。但数组的二分查找时间复杂度小,为O(1);
数组的特点是:寻址容易,插入和删除困难;
链表
链表存储区间离散,占用内存比较宽松,空间复杂度很小,但时间复杂度很大,达O(N)。
链表的特点是:寻址困难,插入和删除容易。
实际上hashMap是一个链表散列
哈希表
那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。
哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。
哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表的数组” ,如图:
哈希表是由数组+链表组成的,
HashMap其实也是一个线性的数组实现的,所以可以理解为其存储数据的容器就是一个线性数组。这可能让我们很不解,一个线性的数组怎么实现按键值对来存取数据呢?这里HashMap有做一些处理。
首先HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value, next,从属性key,value我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,我们上面说到HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。
transient Entry[] table;
可参阅hashMap源码中/**
* Basic hash bin node, used for most entries. (See below for
* TreeNode subclass, and in LinkedHashMap for its Entry subclass.)
*/
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
public final K getKey() { return key; }
public final V getValue() { return value; }
public final String toString() { return key + "=" + value; }
public final int hashCode() {
return Objects.hashCode(key) ^ Objects.hashCode(value);
}
public final V setValue(V newValue) {
V oldValue = value;
value = newValue;
return oldValue;
}
public final boolean equals(Object o) {
if (o == this)
return true;
if (o instanceof Map.Entry) {
Map.Entry<?,?> e = (Map.Entry<?,?>)o;
if (Objects.equals(key, e.getKey()) &&
Objects.equals(value, e.getValue()))
return true;
}
return false;
}
}
HashMap和Hashtable的底层实现都是数组+链表结构实现的,这点上完全一致
如果你想深入了解,参阅hashMap实现原理分析
http://blog.csdn.net/vking_wang/article/details/14166593
感谢万能的互联网,我是IT搬运工
- hashMap的底层数据结构:数组+链表
- java 的HashMap底层数据结构
- java的HashMap底层数据结构
- HashMap的实现原理和底层数据结构
- HashMap的实现原理和底层数据结构
- HashMap的实现原理和底层数据结构
- HashMap的实现原理和底层数据结构
- HashMap的实现原理和底层数据结构
- HashMap的实现原理和底层数据结构
- HashMap的实现原理和底层数据结构
- HashMap的实现原理和底层数据结构
- hashmap数据结构 数组+链表
- java HashMap底层数据结构
- HashMap底层数据结构--面试
- java面试之HashMap的实现原理和底层数据结构
- HashMap的底层实现
- HashMap的底层实现
- HashMap的底层实现
- MySQL5.6配置版安装及主从复制配置
- jeecg如何在子页面删除页签
- Python3--文件读取、写入、追加及seek()方法的使用
- hdu 1878 欧拉回路
- 2017-8-9
- hashMap的底层数据结构:数组+链表
- Scala 入门 WordCount
- react中使用Link在不同路由之间进行参数传值
- 线段树
- C语言(20)素数求和问题
- fork && fork || fork问题
- 看我鼓捣华西安全网(cha.hxsec.com)密码泄露查询接口(有意思的js混淆)
- 第五课记录 Hadoop的起源——Google的基本思想之一
- js中的for循环