数组线性表ArrayList的内部实现

线性表是按顺序存储数据是常用的一种数据结构。大多数线性表的典型操作是:

1,初始化线性表

2,判断表是否为空

3,求线性表的长度

4,读取线性表中的第i个元素

5,查找满足条件的数据元素

6,在线性表的第i个位置之前插入一个新的数据元素

7,删除线性表中的第i个数据元素

8,表置空

9,查找第i个元素的前驱或后继

10,按一个或多个数据项递增或递减重新排列数据元素

数组线性表是顺序存储结构,是最简单,最常用的数据结构。是在内存中开辟一片连续的存储空间,用一组连续的存储单元一次存放数据元素。顺序存储的特点是逻辑上相邻的数据元素,它们物理位置也是相连的。

优点是:简单,直观,随机存取元素十分容易实现,根据定位公式很容易找到表中每个元素的存储位置,所以指定第i个结点很方便

缺点是:插入和删除结点困难,算法效率不高。因为结点是顺序存放的,所以插入或删除一个结点时,必须将该结点以后的所有元素依次向后移动,或者依次向前移动。

JDK1.5以后ArrayList开始引入泛型

接口MyList<E>有操作线性表的基本方法,MyAbstractList<E>抽象类实现了MyList<E>接口,但是该抽象类只是实现了接口中的部分方法,MyArrayList<E>继承扩展抽象类MyAbstractList<E>抽象类

接口MyList<E>

public interface MyList<E> {
  //添加一个元素
  public void add(E e);
  //在index处添加一个元素
  public void add(int index,E e);
  //清楚一个list列表
  public void clear();
  //删除一个元素
  public boolean remove(E e);
  //删除并返回index处的元素
  public E remove(int index);
  //index处的元素设置为元素e
  public Object set(int index,E e);
  //判断是否包含元素e
  public boolean contains(E e);
  //返回index处的元素
  public E get(int index);
  //返回列表中第一个与元素e匹配的下标index
  public int indexOf(E e);
  //返回列表中最后一个与元素e匹配的元素下标index
  public int lastIndeOf(E e);
  //判断列表是否为空
  public boolean isEmpty();
  //返回列表的大小
  public int size(); 
}
MyAbstractList<E>抽象类

public abstract class MyAbstractList<E> implements MyList<E> {//部分实现MyList接口
    protected int size=0;  
	protected MyAbstractList(){
    	
    }
    protected MyAbstractList(E[] objects){
    	for(int i=1;i<objects.length;i++)
    	add(objects[i]);
    }
    @Override
    public void add(E e){
    	add(size,e);
    }
    @Override
    public void add(int index,E e){
    	
    }
    @Override
    public boolean isEmpty(){
    	return size==0;
    }
    @Override
    public int size(){
    	return size;
    }
    @Override
    public boolean remove(E e){
    	if(indexOf(e)>=0){
    		remove(indexOf(e));
    		return true;
    	}
    	else return false;
    }
    @Override
    public E remove(int index){
    	return null;
    }
    @Override
   	public void clear() {
   		// TODO Auto-generated method stub
   		
   	}
   	@Override
   	public Object set(int index, E e) {
   		// TODO Auto-generated method stub
   		return null;
   	}
   	@Override
   	public boolean contains(E e) {
   		// TODO Auto-generated method stub
   		return false;
   	}
   	@Override
   	public E get(int index) {
   		// TODO Auto-generated method stub
   		return null;
   	}
   	@Override
   	public int indexOf(E e) {
   		// TODO Auto-generated method stub
   		return 0;
   	}
   	@Override
   	public int lastIndeOf(E e) {
   		// TODO Auto-generated method stub
   		return 0;
   	}
}
MyArrayList<E>
public class MyArrayList<E> extends MyAbstractList<E> {
      public static final int INITIAL_CAPACITY=16;
      private E[] data=(E[])new Object[INITIAL_CAPACITY];
      
      public MyArrayList(){
    	  
      }
      public MyArrayList(E[] objects){
    	  for(int i=0;i<objects.length;i++)
    	  add(objects[i]);
      }
      public void add(int index,E e){
    	  ensureCapacity();
    	  for(int i=size-1;i>=index;i--)
    		  data[i+1]=data[i];
         data[index]=e;
         size++;   	  
      }
	private void ensureCapacity() {
		if(size>=data.length){
			E[] newData=(E[])(new Object[size*2+1]);
			System.arraycopy(data, 0, newData, 0, size);
			data=newData;
		}
	}
	
	public void clear(){
		data=(E[])new Object[INITIAL_CAPACITY];
		size=0;
	}
	public boolean contains(E e){
		for(int i=0;i<size;i++){
			if(e.equals(data[i])) return true;			
		}
		return false;
	}
	public E get(int index){
		return data[index];
	}
	public int indexOf(E e){
		for(int i=0;i<size;i++)
			if(e.equals(data[i])) return i;
		return -1;
	}
	public int lastIndexOf(E e){
		for(int i=size-1;i>=0;i--)
			if(e.equals(data[i])) return i;
		return -1;
	}
	public E remove(int index){
		E e=data[index];
		for(int j=index;j<size-1;j++)
			data[j]=data[j+1];
		
		data[size-1]=null;
		size--;
		return e;
	}
	public E set(int index,E e){
		E old=data[index];
		data[index]=e;
		return old;
	}
	public String toString(){
		StringBuilder result=new StringBuilder("[");
		for(int i=0;i<size;i++){
			result.append(data[i]);
			if(i<size-1) result.append(",");
		}
		return result.toString()+"]";
	}
	public void trimToSize(){
		if(size!=data.length){
			E[] newData=(E[])new Object[size];
			System.arraycopy(data, 0, newData, 0, size);
			data=newData;
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值