1.HashMap:
(一)什么是HashMap
HashMap是 数组+单链表+红黑数 实现的Map类.
Map介绍:
存储键值对的集合,也可以说是一组键值对的映射,在java中map是一个接口,是和collection接口同一等级的集合根接口。
Map的存储结构:
一个键一个值(每一条记录都是一个键值对)
Map的特点:
1. key用set保存,根据set数据结构的特点可知,key不能重复,用put方法传入相同key的键值对时,将会覆盖之前的键值对
2.key和value的关系只能是一对一或者多对一,不能一对多,即一个key能对应一个value,多个key能对应一个value,但是一个key不能对应多个value
(1)一对一的情况(ok)
(2)多对一的情况(ok) (3)一对多的情况(error)
3.key,value 都可以是任何引用类型(包括 null)的数据(只能是引用类型)
(二)HashMap的存储结构
数组+链表+红黑数,初始存储结构是一个数组,数组的每个节点下是一个单链表或者红黑数
那么放到数组同一个节点下的元素有什么共同性质呢?后面我们来解释
为了更方便的了解这一存储结构,这里得提到一下hash函数 y=hash(x)
1.hash函数是一个映像,关键字是入参,hash函数值是出参,即y=hash(x),x是关键字,y是hash函数值
2.对不同的关键字可能得到相同的hash函数值,即x1 != x2,但是 hash(x1) = hash(x2)
这里引用一个例子:已知一组关键字为(19,14,23,01,68,20,84,27,55,11,10,79)
按照hash函数 H(key) = key mod 13和链地址法(链地址法就是上面HashMap的储存结构所用的方法)来处理冲突所得到的hash表如图所示
上图中落在同一节点的数有什么共同点?答案是他们经过hash函数处理后的值相等,所以就在同一单链表上,这也解决了上面的问题体中所用到的hash函数只是一个简单的求余数处理,事实上HashMap中的hash函数用了很多的异或,移位等运算,对key的hashcode进一步进行计算以及二进制位的调整等来保证最终获取的存储位置尽量分布均匀
2.ArrayList
(一)ArrayList介绍
ArrayList 是 java 集合框架中比较常用的数据结构了。继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。
借鉴下面几篇文章和数据结构(c语言版)
https://blog.csdn.net/qq_36711757/article/details/80394272