基于Object/数组模拟实现ArrayList的增、删、改、查

1、定义了一个DataList接口,里面包含了所需要实现的方法

2、用MyArrayList实现DataList接口,实现里面所定义的方法

3、扩容的核心思想:可以实现动态扩容,当检测到数组容量不够时,自动扩大为原来的1.5倍,扩容的核心思想是将旧数组copy到新数组,再将新数组赋值给当前数组。

4、实现代码如下:

package arrayList;
/**
 * 线性表接口
 * @author tiger
 */
public interface DataList{
	void add(Object obj);
	boolean add(int index,Object obj);
	boolean remove(int index);
	boolean set(int index,Object obj);
	Object get(int index);
	int size();
}
package arrayList;

import java.util.Arrays;

/**
 * 基于数组实现
 * @author tiger
 *
 */
class MyArrayList implements DataList{
	private final static int INIT_SIZE = 5;
	private Object[] ary = new Object[INIT_SIZE];//初始化数组个数
	private int size = 0;		//记录实际元素个数

	public MyArrayList() { }
	/*
	 * 数组元素的添加
	 */
	@Override
	public void add(Object obj) {
		//判断是否需要扩容
		if (size + 1 > ary.length) {
			//对数组进行扩容
			ensureCapacity();
		}
		ary[size] = obj;
		size ++;

	}
	/*
	 * 数组元素的插入
	 */
	@Override
	public boolean add(int index, Object obj) {
		//判断是否需要扩容
		if (size + 1 > ary.length) {
			ensureCapacity();//执行扩容操作
		}
		if (index < size){
			//向右边移动一位
			for (int i = size - 1; i >=index; i--) {
				ary[i+1] = ary[i];
			}
		}
		ary[index] = obj;//将元素插入指定index位置
		size ++;
		return true;
	}

	@Override
	public boolean remove(int index) {
		if (index >= size) {
			System.out.println("--index不存在--");
			return false;
		}
		//向左移一位
		for (int i = index; i < size; i++) {
			ary[i] = ary[i+1];
		}
		ary[size] = null;
		size --;
		return true;
	}

	@Override
	public boolean set(int index, Object obj) {
		ary[index] = obj;
		return true;
	}

	@Override
	public Object get(int index) {
		return ary[index];
	}

	@Override
	public int size() {
		return this.size;
	}

	@Override
	public String toString() {
		return "{ary=" + Arrays.toString(ary) + "}";
	}

	/*
	 * 实现对数组的扩容
	 * 核心思想:创建一个容量更大的新数组替换容量不够的旧数组。
	 */
	private void ensureCapacity(){
		Object[] newArray = new Object[ary.length + (ary.length >> 1)];//容量为原来的1.5倍
		//将旧数组复制迁移到新数组
		//		System.out.println("新数组大小为" + (ary.length + (ary.length >> 1)));
		for (int i = 0,j = 0; i < ary.length; i++,j++) {
			newArray[j] = ary[i];
		}
		//将新数组指向原来的
		this.ary = newArray;
	}
}

package arrayList;

import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("all")
public class MyArrayListTest {
	public static void main(String[] args) {
		DataList myArraylist = new MyArrayList();
		myArraylist.add("today");
		myArraylist.add("is");
		myArraylist.add("a");
		myArraylist.add("nice");
		myArraylist.add("day!");
		myArraylist.add("How");
		myArraylist.add("do");
		myArraylist.add("you");
		System.out.println("添加元素 : "+myArraylist);
		myArraylist.remove(myArraylist.size() - 1);
		System.out.println("移除指定所有处的值 : "+myArraylist);
		System.out.println("取得指定所有处的值 : "+myArraylist.get(1));
		myArraylist.set(1, "tiger");
		System.out.println("修改之后的 : "+myArraylist);
		
	}
}

你可能感兴趣的:(集合)