自己封装ArrayList

本文详细介绍了一个自定义的ArrayList类的实现过程,包括数组初始化、数据添加、修改、删除等核心功能,以及数组扩容机制。通过具体示例展示了如何使用这个自定义的ArrayList。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class MyArrayList <T> {
	
	private Object[] storageData; //定义一个数组
	private final int DEFAULT_ARRAY_SIZE = 10; //数组初始大小10
	private int size; //用来记录数组长度
	
	public MyArrayList(){
		storageData = new Object[DEFAULT_ARRAY_SIZE]; //设置初始大小为10
	}
	
	public MyArrayList(int size){
		if(size>0){
			this.storageData = new Object[size]; //初始化指定数组大小
		} else {
			this.storageData = new Object[DEFAULT_ARRAY_SIZE]; //默认数组大小
		}
	}
	
	
	 /**
	  * 判断index下标是否越界
	  */
	 public void checkRange(int index){
		 if(index < 0 || index >= size) {
	         throw new IndexOutOfBoundsException("index超过界限");
	     }
	 }
	 
	 
	/**
	 * add方法
	 * 添加数据到数组
	 * @param t1
	 * @return
	 */
	 public boolean add(T t){
		isCapacityExpansion(size+1);
		storageData[size++] = t;
		return true;	
	 }
	 //在指定位置添加数据
	 public boolean add(int index,T t){
		 	checkRange(index); //检查index是否越界
			isCapacityExpansion(size+1);
			System.arraycopy(storageData, index, storageData, index+1, size-index); //原数组  从原数据的起始位置开始  目标数组  目标数组的开始起始位置  要copy的数组的长度
			storageData[index] = t;	
			size++;
			return true;
		
	 }
	 //判断是否需要对数组进行扩容
	 public void isCapacityExpansion(int size){
		 if(size>DEFAULT_ARRAY_SIZE){ //如果扩容后长度仍然小于加入新元素后数组的长度,则将加入新元素后数组的长度赋值给新长度
			 CapacityExpansion(size);
		 }
	 }
	 
	 //扩容
	 public void CapacityExpansion(int size){
		 int newLength = (int)(storageData.length * 1.5); //进行1.5倍扩容
		 if(newLength-size<0){
			 newLength = size;
		 }
		 copyOf(newLength); //实现扩容
	 }
	 public void copyOf(int newLength){
		 //创建一个新的数组
		 Object[] newStorageDate = new Object[newLength];
		 //将原数组中所有元素复制到新数组中
		 for(int i=0; i<storageData.length;i++){
			 newStorageDate[i] = storageData[i];
		 }
		 storageData = newStorageDate; //把新数组给原数组 
	 }
	  
	 
	 /**
	  * 返回ArrayList的长度
	  */
	 public int size(){
		 return size;
	 }
	 
	 /**
	  * get方法
	  * 返回指定索引位置的元素
	  */
	 public T get(int index){
		checkRange(index);
		return (T) storageData[index];
	 }
	 
	 /**
	  * set方法
	  * 修改指定下标元素
	  */
	 public void set(int index,T t){
		checkRange(index); //判断是否越界
		storageData[index] = t; //覆盖数据
	 }
	 
	 /**
	  * remove方法
	  * 移除指定下标的元素
	  */
	 public void remove(int index){
		checkRange(index); //判断是否越界   
		int moveSize = size-index-1;
		if(moveSize>0){
			System.arraycopy(storageData, index+1, storageData, index, moveSize);
		}
		storageData[--size] = null; //移除了一个元素,size对应减一,最后一位设为Null
	 }
}

测试类

public class test {
public static void main(String[] args) {
	MyArrayList list = new MyArrayList<>();
	list.add(123);
	list.add("String");
	list.add('c');
	list.add(true);
	
	list.set(3, false);
	
	list.remove(2);
	list.add(2, 'a');
	
	System.out.println("MyArrayList Size = "+list.size());
	
	System.out.print("ArrayList遍历: ");
	
	for(int i = 0;i<list.size();i++){
		System.out.print(list.get(i)+" ");
	}
	
	System.out.println(list.get(10));
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值