最近就是想扒一扒存在硬盘里面的学习资料(突然想到什么),把以前写过的一些东西整理一下分享出来。
这边是ArrayList 的简单实现,当然只实现了部分方法
package com.yck.collection; import java.util.Iterator; /** * 手动实现ArrayList的主要功能 * ArrayList的底层实现就是数组 * */ public class MyArrayList { private Object []elementDate; // private int size; /** * 索引范围的检查 * @param index */ private void rangCheck(int index) { if(index<0 || index >= size) { try { throw new Exception(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 带参构造 * @param initicalCapacity */ public MyArrayList(int initicalCapacity) { if(initicalCapacity<0) try { throw new Exception("int cannot below 0."); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } this.elementDate = new Object[initicalCapacity]; } /** * 无参构造,使用上一个构造函数,初始化数组长度默认为10 */ public MyArrayList() { this(10); } /** * 以下是List接口的一些方法实现,主要的问题在于add 和 remove一定要记住size要跟着改变 * 方法的实现很简单,看一下就能懂 * @param obj */ public void add(Object obj) { if(size >= elementDate.length) { Object []newElementDate = new Object[size*2]; /** * 用for循环写一个复制方法。 */ for(int i=0;i<elementDate.length;i++) { newElementDate[i] =elementDate[i]; } elementDate = newElementDate; } elementDate[size] = obj; size++; } public void add(MyArrayList arr) { if((size+arr.elementDate.length)>this.elementDate.length)//是否需要扩容判断 { Object []newElementDate = new Object[(size+arr.elementDate.length)*2]; //System.arraycopy(elementDate, 0, newElementDate, 0, elementDate.length);//调用系统方法复制 for(int i=0;i<this.size;i++) { newElementDate[i] = elementDate[i]; } elementDate = newElementDate; } for(int i=0;i<arr.size;i++) { this.elementDate[size]=arr.elementDate[i]; size++; } } public void remove(int index) { this.rangCheck(index); for(int i=index;i<elementDate.length-1;i++) elementDate[i] = elementDate[i+1]; size--; } public void remove(Object obj) { for(int i=0;i<size;i++) { if(this.get(i).equals(obj)) this.remove(i); } } public Object get(int index) { this.rangCheck(index); return this.elementDate[index]; } public int size() { return this.size; } public boolean isEmpty() { if(this.size == 0) return true; else return false; } public Iterator iterator() { return new MyIt(); } private class MyIt implements Iterator //那个什么跌蛋器。。不好意思我输入法写出来是这样。。。自定义迭代器的实现 { private int cursor = -1; //游标初始值置为-1; /** * 判断是否有下一个元素 * 1、如果curror + 1 < size;说明有,返回true * 2、如果curror + 1 >size;说明没有,返回 false */ public boolean hasNext() { return cursor+1 < size; } /** * 取出下当前元素,并把游标指向下一个元素 */ public Object next() { cursor++; return elementDate[cursor]; } } public static void main(String[] args) { MyArrayList list = new MyArrayList(3); list.add("aaa"); list.add("uuu"); list.add("ddd"); list.add("eee"); System.out.println(list.elementDate.length+"..."+list.size); for(Iterator iter = list.iterator();iter.hasNext();) { System.out.println((String)iter.next()); } } }
上面有简单的测试,主要是为了测试迭代器。当时写的时候肯定是写一个方法测试一下的= =
有兴趣的朋友可以稍作修改加上泛型