欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【JAVA】ArrayList手动实现(初级)

程序员文章站 2022-04-15 17:20:15
在实现画图板时需要使用ArrayList,要求自己实现,只实现了画图板现阶段需要的功能与一些基础功能,很粗糙,还没有考虑优化。 20190124第一次更新 在动手实现之前,首先考虑我们需要什么功能? 计算机显示图像只显示最顶层的(即我们眼睛所能看到的部分),底层的图像拖到顶层时会从显存里读取图像的数 ......

在实现画图板时需要使用arraylist,要求自己实现,只实现了画图板现阶段需要的功能与一些基础功能,很粗糙,还没有考虑优化。

20190124第一次更新

 

在动手实现之前,首先考虑我们需要什么功能?

计算机显示图像只显示最顶层的(即我们眼睛所能看到的部分),底层的图像拖到顶层时会从显存里读取图像的数据重新加载,这就要求我们存储相应的数据。画图板同理,它需要存放所画的图形数据,以便在需要的时候将其加载到屏幕上,所以我们的画图板需要一个可以存放图形数据的数组,可以往里面添加图形,也可以删除图形。在画图时并不确定会画多少图形,因此数组大小是可以自动变化的。

知道了需求,下面就根据需求手动实现arraylist,我们可以称之为myarraylist

存入数组的对象不确定,可能是直线,也可能是圆,因此需要用到泛型,如下所示

public class myarraylist<e>{
 ……
}

要求数组大小可以根据画的图形数量自动变化,那么我们需要统计往数组里实际放了多少个数据(count)、数组的初始容量(initcapatity)、数组容量的增量(increment),此外还需一个可以存放任意对象的数组object[] src

 public class myarraylist<e> {
     int count = 0;
     // 数组初始大小为10 
     int initcapatity = 10;
     // 增量 
     int increment; 
     object[] src;
}

通过new一个对象的方式获取数组,有两种方式,一个是用无参的构造方法,一个有参的构造方法,参数为初始数组大小,增量都为初始大小的一半

public myarraylist () {
     increment = (int)(initcapacity * 0.5);
     src = new object[initcapacity];
 }
public myarraylist(int initcapacity) { this.initcapacity = initcapacity; increment = (int)(initcapacity * 0.5); src = new object[initcapacity]; }

每画一个图形就要添加一个数据,因此要有add方法

/**

* 在数组末尾增加一个数据

* 

* @param data 要增加的数据

*/

public void add(e data) {
    // 如果传入数据的数量大于数组容量,则新建数组,增量为increment
    if (count >= src.length) {
        object[] dest = new object[src.length + increment];
        // 使用native方法,提高效率
        system.arraycopy(src, 0, dest, 0, src.length);
           src = dest;
    }
    src[count++] = data;
}        

另外有一些arraylist需要实现的基本方法

/**
* 在指定下标位置添加一个数据 * * @param index 要添加数据的位置 * @param data 要添加的数据 */
public void add(int index, e data) { object[] dest; if (count >= src.length) { dest = new object[src.length + increment]; system.arraycopy(src, 0, dest, 0, index); system.arraycopy(src, index, dest, index + 1, src.length - index); } else { dest = src; system.arraycopy(src, 0, dest, 0, index); system.arraycopy(src, index, dest, index + 1, count - index); } src = dest; src[index] = data; count++;
} /** * 删除指定的数据,如果有多个相同的数据,则删除第一个
* * @param data 要删除的数据 */ public void delete(e data) { object[] dest = src; int i; for (i = 0; i < count; i++) { if (src[i] == data) { break; } } system.arraycopy(src, 0, dest, 0, i); system.arraycopy(src, i + 1, dest, i, count - 1 - i); dest[count - 1] = null; src = dest; count--; } /** * 删除指定的数据,根据参数isall来确定是否删除所有与指定数据相同的数据 * * @param data 要删除的数据 * @param isall 是否删除删除所有与指定数据相同的数据 */ public void delete(e data, boolean isall) { if (isall == false) { this.delete(data); } else { object[] dest = src; int tempcount = 0;// 临时计数器,记录要删除的元素的个数 for (int i = 0, j = 0; i < count; i++, j++) { if (src[i] == data) { dest[j] = src[i + 1]; i++; tempcount++; } else { dest[j] = src[i]; } } for (int i = count - tempcount; i < count; i++) { dest[i] = null; } src = dest; count -= tempcount; } } /** * 删除指定下标位置的元素 * * @param index 要删除元素的下标 */ public void delete(int index) { object[] dest = src; system.arraycopy(src, 0, dest, 0, index); system.arraycopy(src, index + 1, dest, index, count - index - 1); dest[count - 1] = null; src = dest; count--; } /** * 根据下标更新元素 * @param index 要更新的元素下标 * @param data 新元素 */ public void update(int index, e data) { src[index] = data; } /** * 根据下标获取对应位置的元素 * * @param index 要取出的元素下标 */ public e get(int index) { return (e) src[index]; } /** * 获取数组的元素个数 * * @return 返回元素个数 */ public int size() { return count; }