数组中顺序表的实现:其实就是模拟ArrayList

本文深入解析自定义ArrayList的实现细节,包括动态数组的初始化、扩容策略、元素的增删查改等核心操作,并通过测试类验证了其功能的正确性和性能。

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

package com.bjsxt.ds.linelist;

import java.util.Arrays;

public class ArrayList implements List {
	private Object[] elementData; // 底层数组来存储多个元素

	private int size;// 存储的元素的个数,线性表的长度,注意,不是数组的长度

	public ArrayList() {
		// 查看真实的ArrayList无参数构造方法是怎么实现的
		this(2);
		// this.elementData = new Object[]{};
		// this.elementData = new Object[0];
	}

	/**
	 * 
	 * @param initialCapacity
	 */
	public ArrayList(int initialCapacity) {
		// 如果initialCapacity<0,抛出异常
		if (initialCapacity < 0) {
			throw new RuntimeException("初始长度要大于0:" + initialCapacity);
		}
		// 按照初始长度给数组分配空间
		elementData = new Object[initialCapacity];
		// 指定线性表初始元素个数,可以省略,int成员变量默认值0
		// this.size = 0;
	}

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

	@Override
	public Object get(int i) {
		// 对i的值进行判断
		if (i >= size) {
			// throw new RuntimeException("数组指针越界异常:"+i);
			throw new IndexOutOfBoundsException("数组指针越界异常:" + i);
		}
		return elementData[i];
	}

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public boolean contains(Object e) {
		// 逐个判断各个元素是否与要查询元素内容相同,效率低下
		// 注意不是elementData.length,而是size
		// for(int i =0;i<size;i++){
		// if(e.equals(elementData[i])){
		// return true;
		// }
		// }
		// return false;
		return this.indexOf(e) >= 0;
	}

	@Override
	public int indexOf(Object e) {
		// 逐个判断各个元素是否与要查询元素内容相同,效率低下
		// 注意不是elementData.length,而是size
		// 有漏洞,如果e是null呢?使用if分别处理
		for (int i = 0; i < size; i++) {
			if (e.equals(elementData[i])) {
				return i;
			}
		}
		return -1;
	}

	@Override
	public void add(int i, Object e) {
		// 如果i超过了size,抛出异常
		if (i > size || i < 0) {
			// throw new RuntimeException("数组指针越界异常:"+i);
			throw new IndexOutOfBoundsException("数组指针越界异常:" + i);
		}
		// 需要先判断length是否足够,如果已经满,需要扩容
		if (size == this.elementData.length) {// 满了
			grow();
		}
		// 添加元素
		// 从后向前后移后面元素一个位置
		for (int j = size; j > i; j--) {
			this.elementData[j] = this.elementData[j - 1];
		}
		// 添加元素到指定位置
		this.elementData[i] = e;
		// 元素个数+1
		this.size++;
	}

	@Override
	public void add(Object e) {
		// 需要先判断length是否足够,如果已经满,需要扩容
		if (size == this.elementData.length) {// 满了
			grow();
		}
		// 增加元素
		this.elementData[size] = e;

		// 元素长度+1
		size++;
		// 可以合并为一条语句
		// this.elementData[size++] = e;
	}

	public void grow() {
		// //创建一个新的更长数组:策略,增长多少? 100% 50%
		// Object [] newArr = new Object [this.elementData.length *2];
		// //将旧数组数据放入新数组
		// for(int i=0;i<this.elementData.length;i++){
		// newArr[i] = this.elementData[i];
		//
		// }
		// //旧数组引用指向新数组
		// this.elementData = newArr;
		elementData = Arrays.copyOf(elementData, this.elementData.length * 2);
	}

	@Override
	public boolean addBefore(Object obj, Object e) {
		return false;
	}

	@Override
	public boolean addAfter(Object obj, Object e) {
		return false;
	}

	@Override
	public Object remove(int i) {
		return null;
	}

	@Override
	public boolean remove(Object e) {
		return false;
	}

	@Override
	public Object replace(int i, Object e) {
		return null;
	}

	@Override
	public String toString() {
		if (this.size == 0) {
			return "[ ]";
		}
		StringBuilder builder = new StringBuilder();
		builder.append('[');
		for (int i = 0; i < size; i++) {
			if (i != size - 1) {
				builder.append(this.get(i) + ",");
			} else {
				builder.append(this.get(i));
			}

		}
		builder.append("]");
		return builder.toString();
	}

}

/**
 * 自定义数组越界异常
 * @author Administrator
 *
 */
public class IndexOutOfBoundsException extends RuntimeException{

	public IndexOutOfBoundsException() {
		
	}

	public IndexOutOfBoundsException(String message) {
		super(message);
		
	}
}

测试类
package com.bjsxt.ds.linelist;

public class Test {
	
	public static void main(String[] args) {
		//创建线性顺序表
		List list = new ArrayList();
		//向末尾添加元素
		list.add("11111");
		list.add("aaaaa");
		list.add("bbbbb");
		list.add("33333");
		list.add("22222");
		list.add(3, "AAAAA");
		
		//进行各种操作验证添加
		System.out.println(list.size());
		System.out.println(list.isEmpty());
		System.out.println(list.contains("44444"));
		System.out.println(list.indexOf("22222"));
		
		System.out.println(list.toString());

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值