Java常见的底层数据结构,一HashMap的分析为例子
2017-02-09 00:00
381 查看
首先:数据结构中有 “数组”和 “链表”两种基本的数据结构.
数组:存储区间是连续的,占用内存空间比较大。查询的时候比较方便,增加或者删除的时候比较缓慢;
链表:存储区间是离散的,占用内存空间比较小。增加或者删除的时候比较方便,查询的时候比较缓慢;
哈希表:结合数组和链表的优点。哈希表的实现由很多种的方法。下面是最为常见的“拉链法”;
![](https://static.oschina.net/uploads/space/2017/0209/105705_kUT0_2870118.png)
在一个长度为16的数组中,每个元素存储的是一个链表的头结点。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。
-----------------------------------------------------------------------------------------------------
上述是最为常见的三种数据结构:
其中List中有LinkedList,ArrayList,Vector .List是有序的,元素可以重复的。
--------------------List--------------------------------------------------------------------------------
比较常用的是ArrayList和LinkedList.
其中ArrayList的底层结构为数组:利于查询,不利于增加或者删除操作;
LinkedList的底层结构为链表:利于增加或者删除操作,不利于查询。
--------------------Set--------------------------------------------------------------------------------
Set常用的为HashSet和TreeSet. Set是无序的,元素不可以重复的。其中TreeSet在插入元素的时候,有自然排序和自己设置顺序。
其中HashSet利用哈希算法来存取元素。
TreeSet底层为二叉树的结构。
--------------------Map-------------------------------------------------------------------------
Map常用的为HashMap和TreeMap.
1.HashMap是基于哈希表的Ma接口实现的,以key-value的形式存在。HashMap的底层结构为“哈希表”。每次创建HashMap的时候就会初始化一个table数组。table的数组中的元素类型为Entry节点。其中HashMap是如何实现存储数据的:
实现的源码为:
首先判断key值是否为空,如果不为空的话,计算key的哈希值,根据哈希值来计算在table数组中的位置。然后迭代该位置上的链表连,判断该条链上是否有hash值相同的。;如果哈希值相同则覆盖以前的value,没有相同的hash值,则将key-value添加到该条链上(则将该节点插入该链表的链头)。
2.TreeMap:底层结构为二叉树。
数组:存储区间是连续的,占用内存空间比较大。查询的时候比较方便,增加或者删除的时候比较缓慢;
链表:存储区间是离散的,占用内存空间比较小。增加或者删除的时候比较方便,查询的时候比较缓慢;
哈希表:结合数组和链表的优点。哈希表的实现由很多种的方法。下面是最为常见的“拉链法”;
![](https://static.oschina.net/uploads/space/2017/0209/105705_kUT0_2870118.png)
在一个长度为16的数组中,每个元素存储的是一个链表的头结点。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。
-----------------------------------------------------------------------------------------------------
上述是最为常见的三种数据结构:
其中List中有LinkedList,ArrayList,Vector .List是有序的,元素可以重复的。
--------------------List--------------------------------------------------------------------------------
比较常用的是ArrayList和LinkedList.
其中ArrayList的底层结构为数组:利于查询,不利于增加或者删除操作;
LinkedList的底层结构为链表:利于增加或者删除操作,不利于查询。
--------------------Set--------------------------------------------------------------------------------
Set常用的为HashSet和TreeSet. Set是无序的,元素不可以重复的。其中TreeSet在插入元素的时候,有自然排序和自己设置顺序。
其中HashSet利用哈希算法来存取元素。
TreeSet底层为二叉树的结构。
--------------------Map-------------------------------------------------------------------------
Map常用的为HashMap和TreeMap.
1.HashMap是基于哈希表的Ma接口实现的,以key-value的形式存在。HashMap的底层结构为“哈希表”。每次创建HashMap的时候就会初始化一个table数组。table的数组中的元素类型为Entry节点。其中HashMap是如何实现存储数据的:
实现的源码为:
public V put(K key, V value) { //当key为null,调用putForNullKey方法,保存null与table第一个位置中,这是HashMap允许为null的原因 if (key == null) return putForNullKey(value); //计算key的hash值 int hash = hash(key.hashCode()); ------(1) //计算key hash 值在 table 数组中的位置 int i = indexFor(hash, table.length); ------(2) //从i出开始迭代 e,找到 key 保存的位置 for (Entry<K, V> e = table[i]; e != null; e = e.next) { Object k; //判断该条链上是否有hash值相同的(key相同) //若存在相同,则直接覆盖value,返回旧value if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; //旧值 = 新值 e.value = value; e.recordAccess(this); return oldValue; //返回旧值 } } //修改次数增加1 modCount++; //将key、value添加至i位置处 addEntry(hash, key, value, i); return null; }
首先判断key值是否为空,如果不为空的话,计算key的哈希值,根据哈希值来计算在table数组中的位置。然后迭代该位置上的链表连,判断该条链上是否有hash值相同的。;如果哈希值相同则覆盖以前的value,没有相同的hash值,则将key-value添加到该条链上(则将该节点插入该链表的链头)。
2.TreeMap:底层结构为二叉树。
相关文章推荐
- 分析Java的hashCode 和 hashCode在HashMap的底层数据结构的应用
- 关于Java的数据结构HashMap,ArrayList的使用总结及使用场景和原理分析
- 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用
- 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用
- java的HashMap底层数据结构
- Java中常见数据结构Map之HashMap
- 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用
- 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用
- Java中常见数据结构:list与map -底层如何实现
- java HashMap底层数据结构
- Java中HashMap底层实现原理(JDK1.8)源码分析
- Java数据结构源码分析-HashMap
- (转载)Java中HashMap底层实现原理(JDK1.8)源码分析
- 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用
- Java中HashMap底层实现原理(JDK1.8)源码分析
- 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用
- Java中HashMap底层实现原理(JDK1.8)源码分析
- Java中常见数据结构:list与map -底层如何实现
- java面试之HashMap的实现原理和底层数据结构
- Java中HashMap底层实现原理(JDK1.8)源码分析