数据结构和算法(四)ArrayList的底层实现

前言

     本章讲解顺序存储结构ArrayList的底层实现

方法

1.概念

我们知道,线性表的顺序存储结构的实现在Java中是以ArrayList来实现的。那么我们用了这么久的ArrayList,如果不知道ArrayList的底层实现岂不是十分的滑稽,让我们来揭开它神秘的面纱。

2.实现思路

1)构建我们自己的List接口

我们可以尝试写出最基本的抽象方法。比如求集合中元素的个数方法等。

package cn.edu.ccut;
/**
 * 模仿List接口
 * @author wangjian
 *
 * @param <E>
 */
public interface List<E> {
	
	public int size();//获得集合长度
	
	public boolean add(E e);//新增对象
	
	public E get(int index);//获得对象
	
	public E remove(int index);//删除对象
	
	public boolean isEmpty();//判断集合是否为空
	
	public int indexOf(Object obj);//判断元素在集合中的位置
	
	public boolean contains(Object obj);//判断元素是否在集合中
}

2)编写具体的实现类ArrayList

package cn.edu.ccut;

import java.util.Arrays;
/**
 * 模仿ArrayList实现类
 * @author wangjian
 *
 * @param <E>
 */
public class ArrayList<E> implements List<E>{
	
	private Object [] datas;//底层使用数组实现
	
	private int size;//集合数据个数
	
	public ArrayList() {
		this.datas = new Object[]{};//初始化数组,长度为0
	}

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

	@Override
	public boolean add(E e) {
		grow(size+1);
		datas[size++] = e;
		return true;
	}
	
	/**
	 * 判断数组是否需要扩容
	 * @param newLength 新的长度
	 */
	private void grow(int newLength){
		if(newLength > datas.length){//需要扩容
			datas = Arrays.copyOf(datas, newLength);
		}
	}

	@Override
	public E get(int index) {
		//判断索引是否在数组允许的范围内
		checkIndexOfArray(index);
		E data = (E)datas[index];
		return data;
	}
	
	private void checkIndexOfArray(int index){
		if( index < 0 || index > size-1){
			String error = "index: "+index+",size: "+size;
			throw new ArrayIndexOutOfBoundsException(error);
		}
	}

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

	@Override
	public E remove(int index) {
		//判断索引是否在数组允许的范围内
		checkIndexOfArray(index);
		E old = (E)datas[index];
		int afterNum = size - (index + 1);//获取删除节点后的数据个数
		if(afterNum > 0){
			System.arraycopy(datas, index+1, datas, index, afterNum);//前移
		}
		datas[--size] = null;
		return old;
	}

	@Override
	public int indexOf(Object obj) {
		if(obj == null){
			for (int i = 0; i < size; i++) {
				if(datas[i] == null)
					return i;
			}
		}else {
			for (int i = 0; i < size; i++) {
				if(datas[i].equals(obj))
					return i;
			}
		}
		return -1;
	}

	@Override
	public boolean contains(Object obj) {
		return indexOf(obj)>=0;
	}

}

这样我们就通过自己的代码实现了Java中的ArrayList,代码读起来还算可以,希望大家仔细消化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值