2022-06-09

动态数组ArrayList:底层是数组,动态扩容,数据查询非常快,但要求连续内存空间。
双向队列LinkedList:底层是链表,不需要连续内存空间,但是查询搜索效率极低。
键值对集合HashMap:底层是数组加链表,存放键值对,检索快,但由于键是按照hash值存储的,所以无序。
TreeMap:底层是优化了的排序二叉树(红黑树),物理实现,使用一个静态内部类Entry代表一个树节点,这是一个完全有序的结构,但是每个树节点都需要保存一个父节点引用,左右孩子节点引用,还有一个value值,效率高但开销大。
priorityQueue:折中。

ArrayList

1.底层是用数组实现的,重要的成员有,元素数组、数组中元素数size、modcount修改次数
2.进行add添加时,若没有指定添加位置,就会根据size确定添加的新元素在数组的下标中进行添加,若 size>=数组长度,要扩容。
3.在进行扩容时,会将modcount++,并且将原数组中的元素拷贝到新数组中,新数组的大小是原数组的1.5倍,默认初始容量是0,且在第一次添加元素时,设置数组大小为0.
4.若指定i为添加元素的位置,会调用System.ArrayCopy方法对i下标以后的元素进行拷贝,拷贝完成之后再把添加的元素放在i位置
5.调用get方法时,由于ArrayList底层基于数组,因此实现了一个RandomAccess标识接口,表示按下标读取数据速度很快,主要是由于数组在内存中是连续存储,可以通过第一个元素的存储地址和偏移量offset直接计算得到访问的元素存储地址
6.若contains方法是通过元素的值进行查找,则需要遍历数组。

LinkList

1.LinkList是基于链表存储的,链表中节点Node主要包含存储元素的引用,指向前驱节点指针prev和指向后继节点的指针next,LinkList中重要成员主要有size、头节点、尾节点。
2.LinkList由于Node在内存中是分散存储的,因此没有对size限制,在执行add方法时,默认添加在链表的尾部。
3.若添加指定元素在链表中的位置,LinkList需要调用node方法,传入参数Index找到对应的节点,在查找对应的节点时,若Index<size/2,从头节点向后遍历,若Index>size/2,从尾结点向前遍历,,因此即使添加元素只需要改变节点的指针,但查找添加的位置的耗时仍然不小,开销不比ArrayList少
4.调用get方法时,若按下标查找,也需要进行同样的遍历,性能比ArrayList差很多,按contains查找也需要进行遍历,与ArrayList半斤八两
5.链表节点除了元素值,还需要维护两个指针,导致LinkList存储开销比ArrayList大得多。

Vector&Stack

1、Vector也是基于数组进行存储,原理与ArrayList类似,区别在于,Vector中会维护一
个CapacityIncrement变量,每进行一次扩容,只增加一个变量的大小,若没有指定CapacityInc,默认为0,且在扩容时,若CapacityInc为0,则将数组大小翻倍。
2.Vector中的所有增删查改方法,都通过在方法上加Sychronized锁方式锁住Vector对象,实现线程安全,性能较差。

不可重复列表

1.HashSet:内部有一个成员变量的HashMap,实际上就是使用的HashMap方法
2.TreeSet:内部有一个成员变量的TreeMap,底层就是TreeMap
3.LinkedHashSet:底层调用的HashSet的方法,

Queue和Dequeue

LinkedList实现Queue和Deque,LinkedList中使用first和last来标记链表的头节点和尾结点,当进行add方法添加时,默认尾插,调用poll方法时,就会返回first节点,调用pop方法时,返回last节点。

ArrayDeque:

数组的方式实现了双端队列,主要是使用head和tail两个指针来标记队列头栈底和队列尾栈顶

PriorityQueue:保证每次取出的元素都是队列中权值最小的

1.使用数组的方式实现了优先队列,内部其实是一个二叉堆结构(小顶堆),原理与堆排序一致
2.重要属性有size,用来标记数组中元素个数,即新添加的元素的下标
3.执行offer操作时,先确认size是否大于等于数组长度,若大于等于则扩容,执行siftup方法
4.siftup方法中,若制定了comparator,按照comparator的compare方法与父节点比较,也就是(size-1>>>1),下标对应的元素进行堆的插入,若没有指定,按元素实现的comparable接口的compareTo方法进行比较。
5.执行poll()方法时,若size为0,返回空值,否则返回数组中下标为0的堆顶元素,将数组下标0位置替换为size-1位置的元素,并减小size,调用siftdown方法整理堆
6.siftdown方法同样也分为根据comparator和comparable两种比较,主要是对0位置新换上来的元素与子节点进行比较,将其与最大的并大于0位置的子节点进行交互,并循环直到将其放到合适的位置。

BlacQueue:阻塞队列
HashMap
重要成员变量

1.负载因子:默认为0.75,表示HashMap存储的元素数数达到HashMap散列数组长度的0.75时就进行扩容
2.散列数组:HashMap通过分离链表法解决哈希冲突的问题,在散列数组中存储的就是链表中的一个头节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值