java 容器_java容器(一)ArrayList

795106e71eec0e366543181239ece01d.png

简单的说,容器是一种能够存放对象的一种工具,就比如我们学过的数组一样,它能存放相同类型的数据。下面我讲结合下面这张图,对java自带的常见容器做分析和实现。

25041272cd5fd78369be13bbaa175301.png
java常见容器
java的容器可以分为 ColectionMap两大类, Colection是序列化的容器,而Map则是基于键值对的容器,这里如果不熟悉的话,可以先只暂时了解一下,然后对于Colection接口,下面又有两个分类,是List和Set,二者很好区别—— List元素可以重复有顺序,Set元素不可重复无顺序,基于他们的实现类有ArrayList、LinkedList和HashSet,而Map的实现类就是HashMap了。

下面我们来分析最简单的ArrayList,首先,它的底层是由数组实现的,因此它在查询方面比较容易,同时,为了解决数组长度有限的问题,ArrayList对它进行了优化,也就是ArrayList的扩容机制,这个我之前已经分析过它的源代码了,基本思想就是:需要扩容时,就给它创建一个新数组,这个数组大小约为原数组的1.5倍,之后拷贝旧数组元素到新数组里面,然后将原来的数组更换为新的数组。详情请查看下面链接哦~

现世安稳:java关于ArrayList扩容机制​zhuanlan.zhihu.com
7dfd1f44032a18d34726e2dd3a0f19c4.png

由于ArrayList父类继承了List接口,而List又继承了Colection接口,因此我们可以先从Colection这个接口开始看起,看定义哪些共同的方法。

e32575d2612abc008fd26ca017f2f58f.png
Colection接口

根据方法名,大家都能推出每个方法的功能是什么,其中可能不是很清楚的就是removeAll和retianAll方法,结合下面这个例子,就会知道它们也很容易区分,removeAll是将list1中的包含list2中的元素全部清除,而retainAll则是只保留list1中与list2中相同的部分元素。

ArrayList

08c60a9144872a8e3242501d1c5728d8.png
list1中去掉在list2中出现的元素1,2
ArrayList

6864390ba1f66f12359147367bb84f9c.png
list1中保留在list2中也存在的元素1,2

好了,闲话不多说了,我们现在开始一步一步实现我们自定义的ArrayList:

private static final int DEFAULT_CAPACITY = 10;// 默认容量为10; private int size;// 表示实际大小 private Object elementData[];// 代表底层的数组

1、实现MyArrayList的两种构造方式

无参构造:

public 

有参构造:

public 

2、add方法实现,并实现扩容机制和泛型的使用

数组实际大小size不停++,会达到默认的容量大小或者自定的capacity大小,此时假如需要再添加元素,就需要对“数组"进行扩容

public 

3、set和get方法实现,加上越界检查处理

public 

public 

4、remove两种方式,根据索引和根据对象来移除

根据索引来移除:利用arraycopy函数将数组elementData从Index+1的位置开始,将其后面的所有元素,长度为elementData.length-Index-1,全部拷贝到elementData数组Index开始到后面的地方。

f126bf5c5af416e9645f3f0fc838500a.png
remove(int Index)示意图
public 

根据对象来移除:只要用equals方法比较元素即可,然后再利用根据索引删除的方法实现。

public 

完整测试代码如下:

package 

0250ece14cb6838901520291528a323e.png
测试结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值