java实现 ArrayList,实现动态扩容

介绍:
我们知道在java中是有ArrayList的,处于好奇,自己通过查阅资料仿写了一下,
我写的MyArrayList的优点在于比java官方的源码好理解,中文注释,接口完善、注释详细。

对外提供的接口:
在这里插入图片描述

源码:

package algorithmBeauty.dataStructure.link.iArrayList;
/**
 * @author : HuXuehao
 * @date : 2021年4月11日下午10:12:27
 * @version : 
*/
@SuppressWarnings("unused")
public class MyArrayList<E> {
	private int size = 0;
	private E[] elements ; 
	private E[] newCapacity;
	private static final int DEFAULT_CAPACITY= 10;
    
	/**
	 * @Description 有参的构造方法
	 * @param capacity
	 */
	public MyArrayList(int capacity) {
		capacity = capacity < DEFAULT_CAPACITY ? DEFAULT_CAPACITY : capacity;
		elements = (E[]) new Object[capacity];
	}
	
	/**
	 * @Description 无参的构造方法
	 * @param DEFAULT_CAPACITY :默认值 10
	 */
	public MyArrayList() {
		this(DEFAULT_CAPACITY);
	}

	/**
	 * @Description 返回list的大小
	 * @return 动态数组中的数据规模
	 */
	public int size() {
		return size;
	}
	
	/**
	 * @Description 清空list
	 */
	public void clear() {
		size = 0;
	}
	
	/**
	 * @Description 判断list是否为空
	 * @return true表示为空,false表示不为空
	 */
	public boolean isEmpty() {
		return size == 0;
	}
	
	/**
	 * @Description 判断list中是否包含element
	 * @return 是否包含 true表示包含,false表示包含
	 */
	public boolean contain(E elemnet) {
		for (int i = 0; i < size; i++) {
			if(elements[i] == elemnet) return true;
		}
		return false;
	}
	
	/**
	 * @Description 向list的尾部添加element
	 * @param element
	 */
	public void add(E element) {
		if(size >= elements.length) dynamicCapacity();
			
		elements[size] = element;
		size++;
	}
	
	/**
	 * @Description 向索引index处插入element
	 * @param index
	 * @param element
	 */
	public void add(int index, E element) {
		indexIsLegal(index);
		
		if(size >= elements.length) dynamicCapacity();
		
		if(index == size) {
			elements[size++] = element;
			return;
		}
		
		for (int i = size-1; i >= index ; i--) {
			elements[i+1] = elements[i];
		}
		elements[index] = element;
		size++;
	}
	
	/**
	 * @Description 获取list中index对应的element
	 * @param index
	 * @return index对应的元素
	 */
	public E getElemnet(int index ) {
		indexIsLegal(index);
		
		return elements[index];
	}
	
	/**
	 * @Description 将list中index处的元素设置为element
	 * @param index
	 * @param element
	 * @return 被覆盖的元素
	 */
	public E set(int index, E element) {
		indexIsLegal(index);
		
		E tempElement = elements[index];
		elements[index] = element;
		
		return tempElement;
	}
	
	/**
	 * @Description 移除list的index处的元素
	 * @param index
	 * @return 被删除的元素
	 */
	public E remove(int index) {
		indexIsLegal(index);
		E removeElement = elements[index];
		for (int i = index; i < size-1; i++) {
			elements[i] = elements[i+1];
		}
		size--;
		return removeElement;
	}
	
	/**
	 * @Description 获取element在list中的index
	 * @param element
	 * @return element对应的索引值
	 */
	public int indexOf(E element) {
		
		for (int i = 0; i < size; i++) {
			if(elements[i] == element) return i;
		}
		
		return -1;
	}
	
	/**
	 * @Description 打印list
	 * @param element
	 * @return element对应的索引值
	 */
	public String toString() {
		if(size == 0) return "[]";
		StringBuilder str = new StringBuilder();
		str.append("[");
		for (int i = 0; i < size; i++) {
			if(i < size-1) {
				str.append(elements[i]+", ");
			}else {
				str.append(elements[i]);
			}
		}
		str.append("]");
		String string = str.toString();
		
		return string;
	}
	
	/**
	 * @Description 判断index是否合法
	 */
	private void indexIsLegal(int index) {
		if(index < 0 && index >=size) {
			throw new IndexOutOfBoundsException("index can not be "+index);
		}
	}
	
	/**
	 * @Description 实现数组的动态扩容
	 */
	private void dynamicCapacity() {
		newCapacity = (E[])new Object[(int)(size()*1.5)];
		
		for (int i = 0; i < size; i++) {
			newCapacity[i] = elements[i];
		}
		
		elements = newCapacity;
	}
	
}

测试代码:

public class Main {
	public static void main(String[] args) {
		ArrayList<Object> arrayList = new ArrayList<>();
		MyArrayList<Integer> list = new MyArrayList<>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		System.out.println(list.toString());
		list.add(3);
		list.add(4);
		list.add(5);
		System.out.println(list.toString());
		
		list.add(1, 6);
		list.add(0, 7);
		list.add(list.size(),8);
		System.out.println(list.toString());
		
		System.out.println(list.getElemnet(list.size()-1));
		
		list.set(0, 0);
		list.set(5, -10);
		list.set(list.size()-1, 100);
		System.out.println(list.toString());
		
		if(list.contain(10)) System.out.println("ok");
		else System.out.println("not found");
		
		list.remove(0);
		System.out.println(list.toString());
		list.remove(list.size()-1);
		System.out.println(list.toString());
		list.remove(3);
		System.out.println(list.toString());
		
		System.out.println("element=6的index是:"+list.indexOf(6));
		System.out.println("element=1的index是:"+list.indexOf(1));
		System.out.println("element=5的index是:"+list.indexOf(5));
		
		list.remove(0);
		System.out.println(list.toString());
		list.remove(2);
		System.out.println(list.toString());
		list.remove(list.size()-1);
		System.out.println(list.toString());
		
		if(list.isEmpty()) System.out.println("arraylist is null");
		else System.out.println("arraylist is not null");
		list.clear();
		if(list.isEmpty()) System.out.println("arraylist is null");
		else System.out.println("arraylist is not null");
		
		System.out.println(list.toString());
	}
}

结果截图:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值