ArrayList类的简单编写

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/L6_6LXXX/article/details/97488054

ArrayList类

编写ArrayList类

package com.mage.arrays;

public class ArrayList {
	private Object[] arrs;
	private int size; //数组实际存储元素个数
	private int capacity;//底层arrs数组的长度,也就是开的内存空间大小
	private static final int DEFAULT_CAPACITY = 10;
	
	public ArrayList() {
		this(DEFAULT_CAPACITY);
	}
	
	public ArrayList(int capacity) {
		arrs = new Object[capacity];
		this.capacity = capacity;
	}
	
	/**
	 * @return 返回数组实际存储的元素个数
	 */
	public int size(){
		return this.size;
	}
	
	/**
	 * @return 返回当前ArrayList底层数组的容量
	 */
	public int opacity() {
		return arrs.length;
	}
	
	/**
	 * @return 返回当前数组是否为null
	 */
	public boolean isEmpty() {
		return this.size==0;
	}
	
	/**
	 * 	 添加元素到指定的位置上
	 * @param value 添加的元素
	 * @param index 添加的位置
	 */
	public void add(Object value,int index) {
		if(index<0||index>size) {
			System.out.println("错误参数:index");
			return;
		}
		//存满了
		if(size==arrs.length) {
			resize(size*2);
		}
		
		for(int i=size-1;i>=index;i--) {
			arrs[i+1]=arrs[i];
		}
		arrs[index]=value;
		size++;
	}
	
	/**
	 *  	添加首元素
	 * @param value 添加的元素值
	 */
	public void addFirst(Object value) {
		add(value,0);
	}
	
	
	/**
	 *  	添加尾元素
	 * @param value
	 */
	public void addLast(Object value) {
		add(value,size);
	}
	/**
	 *  	查询指定元素在当前数组中的索引位置(只找一个)  
	 * @param value
	 * @return 查找的元素的索引 如果不存在返回-1
	 */
	public int getIndexByValue(Object value) {
		for(int i=0;i<size;i++) {
			if(arrs[i]==value) {
				return i;
			}
		}
		return -1;
	}
	
	/**
	 *      返回指定索引位置上的元素
	 * @param index 索引
	 * @return 元素    如果返回null代表当前数组的入参有误
	 */
	public Object get(int index) {
		if(index<0||index>=size) {
			System.out.println("参数有误:index");
			return null;
		}
		return this.arrs[index];
		
	}
	
	
	/**
	 *       	修改数组中指定位置上的元素
	 * @param index  指定的索引
	 * @param value  修改之后的值
	 * @return  修改之前的值 如果索引有问题 返回null
	 */
	public Object set(int index,Object value) {
		if(get(index)==null) {
			return null;
		}
		Object oldValue=arrs[index];
		arrs[index]=value;
		return oldValue;
		
	}
	
	/**
	 * 	根据索引删除元素
	 * @param index 索引
	 * @return 删除的元素   如果索引有误 返回null
	 */
	
	public Object remove(int index) {
		if(get(index)==null) {
			return null;
		}
		Object oldValue = arrs[index];
		for(int i=index;i<size-1;i++) {
			arrs[i]=arrs[i+1];
		}
		size--;
		arrs[size]=null;
		if(size==arrs.length/4&&arrs.length/2>0) {
			resize(arrs.length/2);
		}
		return oldValue;
		
	}
	
	
	/**
	 *  	删除第一个元素
	 * @return
	 */
	public Object removeFirst() {
		return remove(0);
	}
	
	/**
	 *  	删除最后元素
	 * @return
	 */
	public Object removeLast() {
		return remove(size-1);
	}
	
	/**
	 * 数组扩容操作
	 * @param capacity 新数组的容量
	 */
	private void resize(int capacity) {
		Object[] newArrs = new Object[capacity];
		copyOf(arrs,newArrs);
		arrs = newArrs;
	}
	
	/**
	 *  	数组复制
	 * @param src 源数组
	 * @param dest 目标数组
	 */
	private void copyOf(Object[] src,Object[] dest) {
		for(int i=0;i<this.size;i++) {
			dest[i]=src[i];
		}
	}

	/**
	 * 获取当前ArrayList的内容
	 */
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("size:"+this.size+"\topacity:"+this.arrs.length+"\t");
		sb.append("[");
		for(int i = 0;i<size;i++) {
			sb.append(arrs[i]);
			if(i!=size-1) {
				sb.append(",");
			}
		}
		sb.append("]");
		return sb.toString();
	}
}

测试类

package com.mage.arrays;

public class TestArrayList {
	public static void main(String[] args) {
		
		// ArrayList存储数据的对象
		ArrayList arrayList = new ArrayList();// size = 0 capacity 10   
		
		//测试增加不同类型值
		arrayList.addFirst('a');
		arrayList.addFirst("哈哈");
		arrayList.addFirst(44);
		System.out.println(arrayList.toString());
		
		//测试在最后位置加值
		arrayList.addLast(33);
		System.out.println(arrayList.toString());
		
		//测试元素加满了,内存扩容。
		arrayList.addLast(33);
		arrayList.addLast(33);
		arrayList.addLast(33);
		arrayList.addLast(33);
		arrayList.addLast(33);
		arrayList.addLast(44);
		arrayList.addLast(55);
		System.out.println(arrayList.toString());
		
		//测试移除增加元素会撤回扩容嘛
		arrayList.remove(0);
		System.out.println(arrayList.toString());
		
		//测试元素个数为原来的四分之一会压缩一半内存嘛
		arrayList.remove(0);
		arrayList.remove(0);
		arrayList.remove(0);
		arrayList.remove(0);
		arrayList.remove(0);
		System.out.println(arrayList.toString());
		
		//测试修改
		arrayList.set(1, "被修改了");
		System.out.println(arrayList.toString());
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/L6_6LXXX/article/details/97488054