数组容器(ArrayList)设计与Java实现
本篇文章主要跟大家介绍我们最常使用的一种容器ArrayList
、Vector
的原理,并且自己使用Java
实现自己的数组容器MyArrayList
,让自己写的容器能像ArrayList
那样工作。在本篇文章当中首先介绍ArrayList
的一些基本功能,然后去分析我们自己的容器MyArrayList
应该如何进行设计,同时分析我们自己的具体实现方法,最后进行代码介绍!!!
ArrayList为我们提供了哪些功能?
我们来看一个简单的代码,随机生成100个随机数,查看生成随机数当中是否存在50这个数。
public class MyArrayList {
public static void main(String[] args) {
Random random = new Random();
ArrayList list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(random.nextInt(5000));
}
for (int i = 0; i < 100; i++) {
if (list.get(i) == 50) {
System.out.println("包含数据 50");
}
}
list.set(5, 1000);// 设置下标为5的数据为100
list.remove(5);// 删除下标为5的数据
list.remove(new Integer(888));// 删除容器当中的第一个值为5的数据
}
}
上述代码包含了ArrayList
最基本的一个功能,一个是add
方法,向数组容器当中加入数据,另外一个方法是get
从容器当中拿出数据,set
方法改变容器里的数据,remove
方法删除容器当中的数据。ArrayList
的很多其他的方法都是围绕这四个最基本的方法展开的,因此我们在这里不仔细介绍其他的方法了,后面我们自己实现的时候遇到问题的时候自然会需要设计相应的方法,然后我们进行解决即可。
现在我们就需要去设计一个数组容器实现“增删改查”这四个基本功能。
设计原理分析
首先明白一点我们需要使用什么工具去实现这样一个容器。我们手里有的工具就是Java
提供给我们的最基本的功能——数组(这个好像是废话,我们的标题就是数组容器)。
当我们在Java
当中使用数组去存储数据时,数据在Java
当中的内存布局大致如下图所示。
我们在设计数组容器这样一个数据结构的时候主要会遇到两个问题:
- 我们申请数组的长度是多少。
- 当数组满了之后怎么办,也就是我们的扩容机制。