1. java中集合类的关系图
2. 数据结构中什么是数组?什么是链表?
(1)所谓数组,是相同数据类型的元素按一定顺序排列的集合
数组:存储空间是连续的,占用内存严重,故空间复杂度很大。但数组的二分查找时间复杂度小,为0(1);数组的特点是:寻址容易,插入和删除困难;
(2)所谓链表,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到0(1)的复杂度,比另一种线性表顺序快得多,但是查找一个节点或者访问特定标号的节点则需要0(n)的时间,而线性表和顺序表相应的时间复杂度分别是0(logn)和0(1)。
链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达0(N)。链表的特点是:寻址困难,插入和删除容易。
3. ArrayList底层实现方式?
(1)ArrayList通过数组实现,一旦我们实例化ArrayList无参数构造函数默认为数组初始化长度为10
(2)add方法底层实现如果增加的元素格式超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容会放到心数组中。当新数组无法容纳增加的元素时,重复该过程。一旦数组超出长度,就开始扩容数组。扩容数组调用的方法Arrays.copyOf(objArr,objArr.length + 1)
4. LinkedList底层实现方式?
LinkedList底层的数据结构是基于双向循环链表的,且头结点中不存放数据,如下图所示:
既然是双向链表,那么必定存在一种数据结构——我们可以称之为节点,节点实例保存业务数据,前一个节点的位置信息和后一个节点位置信息,如下图所示:
5. HashMap底层实现方式?
HashMap是由数组+链表组成。
put方法底层实现:通过key的hash值%Entry[].length得到该存储的下标位置,如果多个key的hash值%Entry[].length值相同的话就会存储到该链表的后面。