当前位置: 移动技术网 > IT编程>开发语言>Java > 【JAVA】ArrayList手动实现(初级)

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

2019年01月25日  | 移动技术网IT编程  | 我要评论

一天中什么时候最冷,异界之我是创世神,三个有利于的内容

在实现画图板时需要使用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; }

 

 

 

  

  

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网