HashMap 源码分析(一)
HashMap 被设计成专门用来存储键值对(key-value)形式的数据,每一个元素都是一个 Entry<K,V> 节点;它底层的数据结构是哈希表,它是一个数组,同时也是一个链表,简单来说,就是根据节点的 key 的 hash 值,来决定该元素存放在数组的位置,hash 值相同,则在该位置后面以链表的形式存储元素,本文简单分析下 HashMap 的源码,基于 JDK 1.8 。
HashMap 被设计成专门用来存储键值对(key-value)形式的数据,每一个元素都是一个 Entry<K,V> 节点;它底层的数据结构是哈希表,它是一个数组,同时也是一个链表,简单来说,就是根据节点的 key 的 hash 值,来决定该元素存放在数组的位置,hash 值相同,则在该位置后面以链表的形式存储元素,本文简单分析下 HashMap 的源码,基于 JDK 1.8 。
队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。插入的一段称之为队尾,删除的一段称之为队头。之前分析过 LinkedList 的时候就提到,它是一种链式结构,同时还是一个队列,所以,这篇分析其实很简单了,都是基于之前分析过的的插入删除的方法。
栈也是线性表,但是限定仅在表尾进行插入和删除操作的线性表;做过 Android 的应该知道,Activity 是一个典型的栈结构,它的特点就是后进先出;Stack 的源码很少,因为它的父亲 Vector 都帮它做好了,所以本篇分析主要集中在 Vector 里。
LinkedList 内部采用的是链表的方式存储数据,所以不像 ArrayList ,初始化时需要分配容量,该链表中每一个节点都有一个头指针、一个数据域、一个尾指针,所以是一个双向的链表,与双向循环链表不同,它的第一个节点和最后一个节点没有互相引用,所以 LinkedList 其实还是一个队列,这个作为下下篇分享的内容,本篇主要分析其数据元素的增删改查的源码,基于 JDK 1.8 版本的源码分析。
ArrayList 内部采用数组实现,是一种顺序存储方式,对于它的用法,相信大家都烂熟于心了,但是对它内部数组空间的动态管理,也许还不是很熟悉,所以我这次打算分析一下 ArrayList 的源码,基于 JDK 1.8 的版本。