失语瑞萌萌的gravatar头像
失语瑞萌萌 2018-12-09 11:08:36
ArrayList的具体实现,myArrayList

今天,复习了java 的容器框架,自己实现了个简单的myArrayList,包括get,set,add,remove,以及迭代器内部类的实现,自己敲了一遍,感觉不错,
我们知道,所有的容器类都是继承于Iterable接口的,实现该接口则必须提供一个Itrrator方法,用来返回一个迭代器对象,JDK中的Arraylist实现的是list接口,而list接口又继承于collection接口,collection继承于iterator接口,在这里,为了方便,就直接实现iterator接口了

ArrayList的具体实现,myArrayList

package myarraylist;
import java.util.Iterator;
public class MyArrayList<T> implements Iterable<T> {
	private T[] items; // 维护的数组
	private int size; // 数组所含元素的个数
	private static final int DEFAULT_CAPACITY = 10;// 数组默认容量
	// 构造方法

	public MyArrayList() {
		doClear();
	}

	public void clear() {// 清空数组
		doClear();
	}

	private void doClear() {
		this.size = 0;
		ensureCapacity(DEFAULT_CAPACITY);
	}

	private void ensureCapacity(int newCapacity) { // 扩容
		if (newCapacity < size)
			return;
		T[] oldArr = items;
		this.items = (T[]) new Object[newCapacity];
		if (oldArr != null) {
			for (int i = 0; i < size; i++) {
				items[i] = oldArr[i];
			}
		}

	}
	public int size(){
		return size;
	}
	public boolean isEmpty(){
		return size == 0;
	}
	public T get(int index){
		if(index >size || index <0)
			throw new RuntimeException("索引越界");
		return items[index];
	}
	public T set(int index,T t){
		if(index >size || index <0)
			throw new RuntimeException("索引越界");
		T old = items[index];
		items[index] = t;
		return old;
	}
	public boolean add(T t){
		add(size(),t);
		return true;
	}
	public void add(int index, T t) {
		//先判断容量
		if(size() == items.length){
			ensureCapacity(items.length * 2 +1);
		}
		//移动数组
		for (int i = size()-1; i >= index; i--) {
			items[i+1] = items[i];
		}
		items[index] = t;
		size++;
		
	}
	public void remove(int index){
		for (int i = index; i < items.length-1; i++) {
			items[i] = items[i+1];
		}
		size--;
	}
	public Iterator<T> iterator() {
		return new MyArrayListIterator();
	}
	private class MyArrayListIterator implements Iterator<T>{
		private int current = 0;  //游标,初始指在零
		@Override
		public boolean hasNext() {
			return current<size;
		}
		@Override
		public T next() {
			if(!hasNext())
				throw new RuntimeException("数组越界,无法迭代");
			return items[current++];
		}
		public void remove(){
			MyArrayList.this.remove(--current);
		}
	}
}

提供的测试类

package myarraylist;

import java.util.Iterator;

public class Test {
	public static void main(String[] args) {
		MyArrayList<Integer> list = new MyArrayList<>();
		for (int i = 0; i < 20; i++) {
			list.add(i);
		}
		Iterator<Integer> it = list.iterator();
		while(it.hasNext()){
			System.out.println(it.next()+“  ”);
		}
	}

}

输出:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
恩,没啥难的


打赏
最近浏览
最代码官方  LV167 2018年12月9日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友