手动生成Arraylist容器基本功能

手动实现ArrayList容器的部分,加深对底层的理解

package cn.sxau.mycollection;
import javax.management.RuntimeErrorException;
/**
 * 手动生成ArrayList4.0
 * 增加删除方法
 * 增加set get方法
 * 增加数组边界的检查
 *增加数组扩容
 * @author 王村长
 *
 */
public class SxauArrayList05<E> {
 private Object[] elementData;//核心数组
 private int size;//表示数组里的元素数
 
 //默认数组容量为10
 private static final int DEFALT_CAPACITY=10;
 //默认构造器
 public SxauArrayList05(){
  elementData=new Object[DEFALT_CAPACITY];//默认长度为10
 }
 
 //有参构造器,自定义容量
 public SxauArrayList05(int capacity){
  //检查容量
  if(capacity<0){
   throw new RuntimeException("容器容量不能为负数");
  }else if(capacity==0){
   elementData=new Object[DEFALT_CAPACITY];
  }else{ 
  elementData=new Object[capacity];
  }
  }
 
 //返回size
 public int size(){
  return size;
 }
 //自定义add方法
 public void add(E element){
 //考虑是否需要扩容
  if(size==elementData.length){//每增加一个数,size就要加1,当size的值等于数组的长度时,说明数组已经满了
   //如何扩容?定义一个更大的数组
   Object[] newarray=new Object[elementData.length<<1];//左移一位,新数组容量是原来的二倍
   //利用数组的arraycopy方法转移数组
   System.arraycopy(elementData, 0, newarray, 0, elementData.length);
   //把新数组对象的地址赋值给旧的数组,这样新数组的引用指向的是新数组的内容
   elementData=newarray;
   //实现扩容
  }  
  elementData[size++]=element;//size默认值是0,相当于把obj赋值给了elementDate[0]
 }
 
 //增加get方法,可以获取数组中指定索引的值,返回值为泛型
 public E get(int index){
  //检查索引
  checkIndex(index);
  return (E)elementData[index];
 }
 
 //增加set方法,可以设置数组中指定索引的值,不需要返回值,并且检查索引值
 public void set(E element,int index){
  //检查索引
  checkIndex(index);
elementData[index]=element;
 }
 
 //添加检查索引值方法
 public void checkIndex(int index){
  //索引在[0,size)间为合法索引
    if(index<0||index>size-1){
     throw new RuntimeException("该索引不合法"+index);
    }
 }
 //添加remove方法
 public void remove(E element){
  //将element与数组元素一次比较,获取第一个比较结果为true的值
 for(int i=0;i<size;i++){
  if(element.equals(get(i))){
   //将该元素从此处移除
   remove(i);
   }
 } 
 }
 
 //移除指定索引的位置
 public void remove(int index){
  //删除的本质是数组的拷贝
  int num=elementData.length-index-1;
  if(num>0){
  System.arraycopy(elementData, index+1, elementData, index,num);
  }
  elementData[--size]=null;  
 }
 //改写tostring方法
 @Override
 public String toString() {
  StringBuilder sb=new StringBuilder();
  sb.append("[");//append方法,在字符串后面继续累加字符
  for(int i=0;i<size;i++){
   sb.append(elementData[i]+",");
  }
  sb.setCharAt(sb.length()-1,']');
  
  return sb.toString();
  
 }
 //测试
 public static void main(String[] args) {
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值