Java 中模仿源码自定义ArrayList
程序员文章站
2024-03-02 20:37:10
java 中模仿源码自定义arraylist
最近看了下arraylist的源码,抽空根据arraylist的底层结构写了一个功能简单无泛型的自定义arraylsit,帮...
java 中模仿源码自定义arraylist
最近看了下arraylist的源码,抽空根据arraylist的底层结构写了一个功能简单无泛型的自定义arraylsit,帮助自己更好理解arraylist:,其实现的底层数据结构为数object组,代码如下:
/** * 自己实现一个arraylist * */ public class myarraylist { private object[] elementdata; private int size; public int size(){ return size; } public boolean isempty(){ return size==0; } //默认容量为10 public myarraylist(){ this(10); } /** * 自定义容量 * @param initialcapacity */ public myarraylist(int initialcapacity){ if(initialcapacity<0){ try { throw new exception(); } catch (exception e) { e.printstacktrace(); } } elementdata = new object[initialcapacity]; } /** * 添加一个元素 * @param obj */ public void add(object obj){ //数组扩容和数据的拷贝,重新new一个数组 if(size==elementdata.length){ object[] newarray = new object[size*2+1]; system.arraycopy(elementdata, 0, newarray, 0, elementdata.length); elementdata = newarray; } elementdata[size++]=obj; // size++; } /** * 通过索引获取元素 * @param index * @return */ public object get(int index){ rangecheck(index); return elementdata[index]; } /** * 通过索引删除元素 * @param index */ public void remove(int index){ rangecheck(index); int nummoved = size - index - 1; if (nummoved > 0){ system.arraycopy(elementdata, index+1, elementdata, index, nummoved); } elementdata[--size] = null; // let gc do its work } /** * 删除对应的元素(利用equal判断元素是否一致) * @param obj */ public void remove(object obj){ for(int i=0;i<size;i++){ if(get(i).equals(obj)){ //注意:底层调用的equals方法而不是==. remove(i); } } } /** * 设置索引对应的元素 * @param index * @param obj * @return */ public object set(int index,object obj){ rangecheck(index); object oldvalue = elementdata[index]; elementdata[index] = obj; return oldvalue; } /** * 将元素插入对应的位置 * @param index * @param obj */ public void add(int index,object obj){ rangecheck(index); ensurecapacity(); //数组扩容 system.arraycopy(elementdata, index, elementdata, index + 1, size - index); elementdata[index] = obj; size++; } /** * 数组扩容 */ private void ensurecapacity(){ //数组扩容和数据的拷贝 if(size==elementdata.length){ object[] newarray = new object[size*2+1]; system.arraycopy(elementdata, 0, newarray, 0, elementdata.length); // for(int i=0;i<elementdata.length;i++){ // newarray[i] = elementdata[i]; // } elementdata = newarray; } } /** * 数组下标检查 * @param index */ private void rangecheck(int index){ if(index<0||index>=size){ try { throw new exception(); } catch (exception e) { e.printstacktrace(); } } } public static void main(string[] args) { myarraylist list = new myarraylist(3); list.add("333"); list.add("444"); list.add("5"); list.add("344433"); list.add("333"); list.add("333"); for (int i = 0; i < list.size(); i++) { system.out.println(list.get(i)); } system.out.println("------------------------------"); list.remove("444"); list.add(2, "a"); for (int i = 0; i < list.size(); i++) { system.out.println(list.get(i)); } } }
测试结果:
333 444 5 344433 333 333 ------------------------------ 333 5 a 344433 333 333
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!