纯手写ArrayList集合框架

一.自定义list接口

package com.xhz.arraylist;
/**
 * 自定义list接口
 * @author xhz
 *
 * @param <E>
 */
public interface ExtList<E> {
	public void add(E object);
	
	public void add(int index,E object);
	
	public E remove(int index);
	
	public boolean remove(E object);
	
	public int size();
	
	public E get(int index);
	
}

二.自定义ArrayList集合

package com.xhz.arraylist;

import java.util.Arrays;

/**
 * 自定义ArrayList集合
 * 
 * @author xhz
 *
 */
public class ExtArrayList<E> implements ExtList<E> {
	// ArrayList底层采用数组存放
	private Object[] elementData;

	// 默认数组容量
	private static final int DEFAULT_CAPACITY = 10;

	// ArrayList实际存储的数据数量
	private int size;

	// ArrayList 指定数组初始的容量
	public ExtArrayList(int initialCapacity) {
		if (initialCapacity < 0) {
			throw new IllegalArgumentException("初始容量不能小于0");
		}
		elementData = new Object[initialCapacity];
	}

	// 默认初始化容量为10
	public ExtArrayList() {
		this(DEFAULT_CAPACITY);
	}

	// 线程安全问题 ArrayList底层每次扩容是以1.5倍
	public void add(E object) {
		// 1.判断实际存放数据容量是否大于elementData
		ensureExplicitCapacity(size + 1);
		// 2.使用下标进行赋值
		elementData[size++] = object;
	}

	//通过指定位置添加元素
	public void add(int index,E object) {
		// 1.判断实际存放数据容量是否大于elementData
		ensureExplicitCapacity(size + 1);
		System.arraycopy(elementData, index, elementData, index + 1,size-index);
		elementData[index]=object;
		size++;
	}

	// int minCapacity 最小扩容容量size+1
	private void ensureExplicitCapacity(int minCapacity) {
		if (size == elementData.length) {
			// 原來本身elementData容量大小
			int oldCapacity = elementData.length;
			// 新数据容量大小(oldCapacity>>1)=oldCapacity/2
			int newCapacity = oldCapacity + (oldCapacity >> 1);
			// 如果初始容量为1的时候,那么它扩容的大小为多少呢?
			//最小扩容容量
			if (newCapacity - minCapacity < 0)
				newCapacity = minCapacity;// 最少保证容量和minCapacity一样
			// 將老数组的值复制到新数组里
			elementData = Arrays.copyOf(elementData, newCapacity);
		}
	}

	//移除指定位置的元素
	public E remove(int index) {
		//1.使用下标查询该值是否存在
		E object=get(index);
		//计算删除元素后面的长度
		int numMoved=size-index-1;
		//2.刪除原理分析 使用arraycopy往前移动数据,将最后一个变为空
		if(numMoved>0) 
			System.arraycopy(elementData, index+1, elementData, index,numMoved);
		elementData[--size]=null;//將最后一个元素变为空
		return object;
	}

	//删除对象(删除相同元素时只删除第一个)
	public boolean remove(E object) {
		for (int i = 0; i < elementData.length; i++) {
			Object value=elementData[i];
			if(value.equals(object)) {
				remove(i);
				return true;
			}
		}
		return false;
	}

	// 检查数组是否在界线内
	private void rangeCheck(int index) {
		if (index >= size)
			throw new IndexOutOfBoundsException("越界啦");
	}

	// 返回ArrayList实际存储的元素数量
	public int size() {
		return size;
	}
	
	@SuppressWarnings("unchecked")
	E elementData(int index) {
		return (E) elementData[index];
	}

	// 使用下标获取数组元素
	public E get(int index) {
		rangeCheck(index);// 检查是否越界
		return elementData(index);
	}
	
}

三.测试

package com.xhz.test;

import java.util.ArrayList;
import java.util.Arrays;

import com.xhz.arraylist.ExtArrayList;

public class Test {
	
	public static void main(String[] args) {
		ArraysCopyOf();
		SystemArrayCopy();
		ArrayList();
		ExtArrayList();
		GenericType();
	}

	//底层采用数组方式
	//怎么保存集合存放无限大小 ---数组扩容技术
	public static void ArraysCopyOf() {
		System.out.println("ArraysCopyOf()开始#############################################");
		Object[] objects= {1,2};
		System.out.println("objects:"+objects.length);
		for (Object object : objects) {
			System.out.println("循环:"+object.toString());
		}
		System.out.println("#############################################");
		//返回新的数组,将原来长度为2的数组现在扩容为10,原来本身的数据不变
		Object[] copyNesObjects = Arrays.copyOf(objects, 10);
		System.out.println("copyNesObjects:"+copyNesObjects.length);
		System.out.println("ArraysCopyOf()结束#############################################\n");
	}
	
	public static void SystemArrayCopy() {
		System.out.println("SystemArrayCopy()开始#############################################");
		//参数src原数组   srcPos起始位置   dest目标数组   destPos目标数组起始位置  length复制长度
		//System.arraycopy(src, srcPos, dest, destPos, length);
		int[] fun= {0,1,2,3,4,5,6};
		System.arraycopy(fun, 3, fun, 0, 4);
		for (int i : fun) {
			System.out.println("i:"+i);
		}
		System.out.println("SystemArrayCopy()结束#############################################\n");
	}
	
	public static void ArrayList() {
		System.out.println("ArrayList()开始#############################################");
		// 1.jdk1.7之后数组默认数据大小代码放在add方法
		// 2.arraylist底层采用数组实现 数组名称elementData
		// 3.arraylist底层采用数组实现 默认初始化最小容量为10
		ArrayList<String> arrayList = new ArrayList<String>();
		arrayList.add("张三");
		System.out.println(arrayList.get(0));
		System.out.println("ArrayList()结束#############################################\n");
	}
	
	public static void ExtArrayList() {
		System.out.println("ExtArrayList()开始#############################################");
		ExtArrayList extArrayList = new ExtArrayList(1);
		extArrayList.add("张三");
		extArrayList.add("李四");
		extArrayList.add("王五");
		extArrayList.add("赵六");
		extArrayList.add("小盒子");
		extArrayList.add(0,"麻子");
		
		for (int i = 0; i < extArrayList.size(); i++) {
			System.out.println(extArrayList.get(i));
		}
		System.out.println("#############################");
		extArrayList.remove(0);
		for (int i = 0; i < extArrayList.size(); i++) {
			System.out.println(extArrayList.get(i));
		}
		System.out.println("ExtArrayList()结束#############################################\n");
	}
	
	public static void GenericType() {
		System.out.println("GenericType()开始#############################################");
		//反射机制不能够获取泛型类型,可通过字节码方式获取
		ExtArrayList<String> extArrayList=new ExtArrayList<String>();
		extArrayList.add("张三");
		extArrayList.add("李四");
		extArrayList.add("王五");
		extArrayList.add("赵六");
		extArrayList.add("小盒子");
		extArrayList.add(0,"麻子");
		
		for (int i = 0; i < extArrayList.size(); i++) {
			System.out.println(extArrayList.get(i));
		}
		System.out.println("#############################");
		extArrayList.remove(0);
		for (int i = 0; i < extArrayList.size(); i++) {
			System.out.println(extArrayList.get(i));
		}
		System.out.println("GenericType()结束#############################################\n");
	}
	
}


猜你喜欢

转载自blog.csdn.net/qq_35393693/article/details/80507071