七叶笔记 » java编程 » Java中数组容器(ArrayList)设的计与实现

Java中数组容器(ArrayList)设的计与实现

本篇文章主要跟大家介绍我们最常使用的一种容器ArrayList、Vector的原理,并且自己使用Java实现自己的数组容器MyArrayList,让自己写的容器能像ArrayList那样工作。在本篇文章当中首先介绍ArrayList的一些基本功能,然后去分析我们自己的容器MyArrayList应该如何进行设计,同时分析我们自己的具体实现方法,最后进行代码介绍!!!

ArrayList为我们提供了哪些功能

我们来看一个简单的代码,随机生成100个随机数,查看生成随机数当中是否存在50这个数。

上述代码包含了ArrayList最基本的一个功能,一个是add方法,向数组容器当中加入数据,另外一个方法是get从容器当中拿出数据,set方法改变容器里的数据,remove方法删除容器当中的数据。ArrayList的很多其他的方法都是围绕这四个最基本的方法展开的,因此我们在这里不仔细介绍其他的方法了,后面我们自己实现的时候遇到问题的时候自然会需要设计相应的方法,然后我们进行解决即可。

现在我们就需要去设计一个数组容器实现“增删改查”这四个基本功能。

设计原理分析

首先明白一点我们需要使用什么工具去实现这样一个容器。我们手里有的工具就是Java提供给我们的最基本的功能——数组(这个好像是废话,我们的标题就是数组容器????)。

当我们在Java当中使用数组去存储数据时,数据在Java当中的内存布局大致如下图所示。

我们在设计数组容器这样一个数据结构的时候主要会遇到两个问题:

我们申请数组的长度是多少。当数组满了之后怎么办,也就是我们的扩容机制。

对于这两个问题,首先我们数组的初始大小可以有默认值,在我们自己实现的MyArrayList当中设置为10,我们在使用类时也可以传递一个参数指定初始大小。第二个问题当我们的数组满的时候我们需要对数组进行扩容,在我们实现的MyArrayList当中我们采取的方式是,新数组的长度是原数组的两倍(这个跟JDK的ArrayList方式不一样,ArrayList扩容为原来的1.5倍)。

代码实现

为了让我们的类实现的更加简单我们在代码当中就不做很多非必要的逻辑判断并且抛出异常,我们的代码只要能表现出我们的思想即可。

首先定义一个接口MyCollection,表示我们要实现哪些方法!

我们的构造函数,初始化过程。

我们需要实现的最复杂的方法就是add了,这个方法是四个方法当中最复杂的,其余的方法都相对比较简单。

进入add方法之后,我们需要找到符合要求的最小数组长度,这个值通常是容器当中元素的个数size + 1 ,也就是图中的minCapacity首先先比较这个值和现在数组的长度,如果长度不够的话则需要进行扩容,将数组的长度扩大到原来的两倍。如果不需要扩容,则直接讲元素放入到数组当中即可。

我们为什么需要将ensureCapacity的访问限制权限设置为public?因为我们想让用户尽量去使用这个函数,因为如果我们如果写出下面这样的代码我们会一直申请内存空间,然后也需要将前面的数组释放掉,会给垃圾回收器造成更大的压力。

下面我们对ArrayList的方法进行测试:

从上面的测试结果我们可以看出提前使用ensureCapacity方法之后,程序执行的时间更加短。

插入数据的add方法。

add在指定下标插入数据。

首先将插入下标后的数据往后移动一个位置然后在将数据放在指定下标的位置。

删除数据的方法remove。

首先先删除指定下标的数据。然后将指定下标后的数据往前移动一个位置在实际的操作过程中我们可以不删除,直接移动,这样也覆盖被插入位置的数据了。

移除容器当中具体的某个对象。

set方法,这个方法就很简单了。

重写toString方法。

测试代码

完整代码

以上就是Java中数组容器(ArrayList)设的计与实现的详细内容,更多关于Java数组容器的资料请关注七叶笔记其它相关文章!

相关文章