本文主要说一下数组、链表、二叉树、HashMap存储结构,及其优缺点。

数组和链表

1、数组是将元素在内存中连续存放。
   链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。
2、数组必须事先定义固定的长度,不能适应数据动态的增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;
   链表动态地进行存储分配,可以适应数据动态地增减的情况。
3、(静态)数组从栈中分配空间,对于程序员方便快速,但是自由度小;
    链表从堆中分配空间,自由度大但是申请管理比较麻烦。

数组链表存储结构

黄色数组,蓝色链表结构

链表:单链表、双向链表、循环链表

由其存储结构可以看出:数组在查询效率比较高直接通过索引就查询,插入和删除效率低,因为要移动后面所有元素。链表在查询效率上低,但是插入删除效率高

二叉树

几种特殊的二叉树:满二叉树、完全二叉树、平衡二叉树

二叉树可以采用顺序存储结构和链式存储结构。对于完全二叉树和满二叉树采用顺序存储结构比较适合

1)一个完全二叉树如下:

数组链表存储结构

2)但是对于一般的二叉树如下,是不是很浪费空间。

数组链表存储结构

再看极限的,abcd4个元素需要15个长度的数组来存,实在是太浪费了。

数组链表存储结构

3)在2)中我们呢看到这种不适合用数组。

我们用二叉链表

数组链表存储结构

数组链表存储结构

为了方便访问某结点的双亲,还可以给链表结点增加一个双亲字段parent,用来指向其双亲结点。这种叫三叉链表

数组链表存储结构

数组链表存储结构

HashMap

数组+链表+红黑树。

数组链表存储结构

传入的数组长度必须是2的指数次幂。如果传入13,在put会转成大于13最接近2的指数次幂的值,那就是16了。

为什么必须是2的指数次幂?

先留着

hash冲突?

不同的entry通过哈希函数等计算出来下标一样,就叫hash冲突

解决hash冲突?

一种是开放寻址法,另一种是链表法,好像好有其他方法。

开放寻址法:

比如计算出Entry6的下标是2,但是2下标已经有值了,就往后找,3也被占了,4没有则放入4.

数组链表存储结构

链表法:

链表法也正是被应用在了HashMap中,HashMap中数组的每一个元素不仅是一个Entry对象,还是一个链表的头节点。每一个Entry对象通过next指针指向它的下一个Entry节点。当新来的Entry映射到与之冲突的数组位置时,只需要插入到对应的链表中即可

数组链表存储结构

Java 1.8以后是数组+单链表+红黑树(链表>8时转成红黑树)

链表缺点就是查询效率低,如果链表太长,那么效率也低,红黑树是接近于平衡的二叉树,远远高于链表的查询效率。

相关文章:

  • 2021-12-07
  • 2021-12-05
  • 2022-12-23
  • 2021-09-22
  • 2022-12-23
  • 2022-12-23
  • 2021-06-04
  • 2022-12-23
猜你喜欢
  • 2021-12-06
  • 2022-12-23
  • 2021-07-27
  • 2021-04-02
  • 2021-10-21
  • 2021-12-03
  • 2021-05-26
相关资源
相似解决方案