java 简易版的ArrayList

简化实现了ArrayList的底层结构,提供构造,增删改查,越界判断等功能
没有加泛型的版本:

/**
 * 自己实现一个ArrayList,复习底层结构
 * @author majinbuu
 *
 */
public class List0 { //通配符E表示泛型
	private int SIZE; //size的默认初始值是0,一开始没放东西进去
	private Object[] element; //ArrayList的元素都为Object类型
	private static final int DE_SIZE=10; //数组默认长度
	//构造函数前加public
	public List0(){  //无参构造函数
		element=new Object[DE_SIZE];
	}
	
	public List0(int creat_num) { //有参构造函数
		element=new Object[creat_num];
	}
	
	/**
	//add方法(没有数组自动扩容功能):
	public void add(Object obj) {
		element[SIZE++]=obj;
	}
	*/
	//具有数组自动扩容功能的add方法:
	public void add(Object obj) {
		if(SIZE==element.length) {
			int newNum=element.length+(element.length>>1); //1.5倍
			Object[] newArray=new Object[newNum]; //创建新数组
			System.out.println(newArray.length);
			//使用arraycopy函数进行数组的拷贝
			System.arraycopy(element, 0, newArray, 0, element.length);
			element=newArray; //将新数组的引用赋值给老数组,老数组对象被垃圾回收机制清理掉
		}
		element[SIZE++]=obj;
	}
	
	//重写Object中的toString方法
	@Override
	public String toString() {
		//定义一个StringBuilder来打印
		StringBuilder out=new StringBuilder();
		out.append('[');
		for(int i=0;i<SIZE;i++) { //限定了SIZE,没有添加元素的位置的NULL不会打印出来
			out.append(element[i]+","); //应使用" ",而不是' '     即使用字符串类型
		}
		
		//for(Object obj:element) {
		//	out.append(obj);   //打印出来是[[1998,8,25,null,null,null,null...null]
		//}
		out.setCharAt(out.length()-1, ']'); //把最后一个,替换成]
		return out.toString(); 
		/** out.toString返回的是:
		 *  public String toString() {
       			return new String(value, 0, count);
    }
		 */
	}
	
	//get set 方法 以及 索引合法性判断(越界)
	public Object get(int index) {
		rangeValid(index);
		Object re=element[index];
		return re;
	}
	
	public void set(int index,Object newOne) {
		rangeValid(index);
		element[index]=newOne;
	}
	
	//索引合法性判断(越界)【封装】
	public void rangeValid(int index) {
		if(index<0||index>element.length-1) {
			throw new RuntimeException(); //手动抛出异常
		}
	}
	
	//删除 (这里用的自己编写的方法,也可以使用自带的arraycopy方法)
	//SIZE:表示已添加的元素的个数
	//element.length:表示数组的总容量
	public void remove(int index) {
		rangeValid(index);
		for(int i=index;i<SIZE-1;i++) { //这里使用SIZE
			set(i,get(i+1)); //前移
		}
		element[SIZE-1]=null; //删除前数组的最后一个元素 设置为null
		SIZE--; //调试时发现SIZE没有更新,这里减1更新
	}
	
	public static void main(String[] args) {
		List0 test0 =new List0(8); //初始化数组为8
		//如果没有重写Object中的toString方法,打印出来的结果如下:
		//System.out.println(test0); //Mylist.List0@15db9742
		for(int i=0;i<20;i++) {
			test0.add(i);
		}
		//打印结果,可以看出,自动扩容了
		System.out.println(test0); //[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
		System.out.println(test0.get(8)); //8
		//System.out.println(test0.get(1000)); //Exception in thread "main" java.lang.RuntimeException
		test0.set(0, 10); //将索引0的值改成10
		System.out.println(test0.get(0)); //10
		test0.remove(0);
		System.out.println(test0); //[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值