🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
数组容器(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
当中的内存布局大致如下图所示。
我们在设计数组容器这样一个数据结构的时候主要会遇到两个问题:
- 我们申请数组的长度是多少。
- 当数组满了之后怎么办,也就是我们的扩容机制。
对于这两个问题,首先我们数组的初始大小可以有默认值,在我们自己实现的MyArrayList
当中设置为10,我们在使用类时也可以传递一个参数指定初始大小。第二个问题当我们的数组满的时候我们需要对数组进行扩容,在我们实现的MyArrayList
当中我们采取的方式是,新数组的长度是原数组的两倍(这个跟JDK
的ArrayList
方式不一样,ArrayList
扩容为原来的1.5倍)。
代码实现
为了让我们的类实现的更加简单我们在代码当中就不做很多非必要的逻辑判断并且抛出异常,我们的代码只要能表现出我们的思想即可。
- 首先定义一个接口
MyCollection
,表示我们要实现哪些方法!
public interface MyCollection {
/**
* 往链表尾部加入一个数据
* @param o 加入到链表当中的数据
* @return
*/
boolean add(E o);
/**
* 表示在第 index 位置插入数据 o
* @pa