Java 集合List攻略1:ArrayList

前言废话:
一般面试官会让你比较几种集合之间的优劣点,其实面试官想问的是不同集合底层的数据结构,数据结构决定了集合的性能优劣

ArrayList

1 数据结构
ArrayList 底层的数据结构是对象数组
图解不解释:
在这里插入图片描述

不要看太多,源码这种东西,不是要你全看懂,我们只需要了解我们想要的东西,物尽其用就好,啥都懂浪费时间,又不是要搞革命对不对

就看这三个
第一个是默认数组长度
第二个是实际存储数组
第三个数组存储的元素个数

蚂蚁小贴士:其实所有的集合底层都尼玛是基于数组实现的,唯一的差别在于数组的成员类型

2 Add方法
关于add方法其实要看的东西就只有一句话,但是为了你看的舒服点给你看个流程图,里面的各种比较你不懂也没事,只要看到最后一句话就OK

老规矩先抠图
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

流程的演示,从一开始的创建对象,构造方法其实没啥内容,就是两个数组绑定在一块儿了,
你想问我为啥?
ArrayList list=new ArrayList<>();
大家一般创建都这么创建,这是一个默认的创建方法,这样创建会将两个数组绑定到一起,也就是说创建的底层的对象数组是个空数组
新增的时候去判断长度,如果是调用的上述构造方法创建,size是0,会去拿已有的size+1跟默认的10进行比较,取最大值来进行扩容,这个可能是程序要想初期的时候扩容到位。
其实还有其余的构造方法,可以指定长度创建对象,如果用默认的方法,频繁扩容性能会极差,可以初期一步到位,这个是一个优化的点。

从add方法开始到最后一张图,最关键的就是最后一句话:
蚂蚁稍微讲解下,其实这么一套流程主要就是做的对数组的长度判断

因为数组是固定长度的么,一开始创建长度是10,后面如果超过10,那么就需要进行扩容,所以add元素的时候经常要判断是否要扩容
扩容的方案是默认直接扩充1.5倍,如果不行那么就扩充到你需要的地步
如果第一次扩容1.5倍仍然不达标,程序开发者并没有继续往上扩充1.5倍,而是直接用老的容量,加上待插入的容量计算出一个总容量来进行扩容.
同时对方还考虑到了一种极端情况,那就是数组长度是int类型,如果长度已经变态到超出int上限的时候,就是huguCapacity方法处理。
建议大家可以学习下源码里大神的编码风格,方法命名,代码封装一下子就能看懂含义。

这个稍微了解下,主要需要记住的就是他娘的每次add都要检测是否要扩容,因为扩容所以ArrayList 添加效率比较差,这是其诟病的地方。

3 remove方法

上图

在这里插入图片描述
看看红圈圈,删除的时候还是要数组复制,整体移动,所以咯其效率也比较差,移除的最后一个元素设置为空,GC进行回收。

4 查询
首先抛出一个问题:计算机中随机访问与顺序访问之间的区别?
随机访问就是直接找到第i个数
顺序访问就是从1开始一直找,直到i
ArrayList的数据结构是数组,他的get方法就是随机访问,可以直接找到第i个数,这个不用说,我们用数组的时候想拿第几个元素直接指定下标就能拿到。
LinkedList的数据结构是链表,他的get方法是顺序访问,这一点先在这里提及,在LinkedList里我再进行阐述

蚂蚁小结:
ArrayList 新增 删除效率比较低,因为要做数组的复制,性能消耗较大
蚂蚁说话比较糙,砍掉许多干扰的枝丫,追求本源,简化大家的学习过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值