第三章 顺序表--ArrayList源码分析

ArrayList源码分析

顺序表

ArrayList分析

  • 底层是数组实现的,但是长度是可以变话的,元素是Object类型的

  • Arrays.copyOf();产生的是一个新的数组。

  • 数组的元素个数是length;

  • Array List元素个数是size();因为底层是数组扩容实现的,扩容的长度是按公式固定增长的。

  • List 接口

    
        public interface List {
            public int size();
            public Object get(int i);
            public void add(Object e);
            public boolean isEmpty();
            public void add(int i,Object e);
        }
    
  • ArrayList实现类

    
        public class ArrayList implements List{
            private Object[] elementData;//没有确定长度的Object类型的数组
            private int size;//不是数组分配的长度,而是元素的个数
        
        
            //构造方法(initalCapacity:初始长度)
            public ArrayList(int initalCapacity){
                elementData = new Object[initalCapacity];//给数组分配指定数量的空间
                size = 0; //数组的默认个数是0
            }
        
            public ArrayList(){
                this(4);//没有指定长度,默认长度是4
        //        elementData = new Object[]{};//没有指定长度,长度是0
            }
        
            public void add(int i,Object e){
                //如果数组的元素个数和数组的长度相等了,需要扩容。
                if(i<0 ||i>size){
                    throw new MyArrayIndexOutofBoundsException("数组索引越界异常:"+i);
                }
                if(size==elementData.length) {
                    grow();
                }
                //添加了元素以后,后面的元素后移
                for(int j=size;j>i;j--){
                    elementData[j] = elementData[j-1];
                }
                //添加元素
                elementData[i] = e;
                //元素个数++
                size++;
            }
        
            public void add(Object e){
                this.add(size,e);//添加到最后索引的位置
            }
        
            private void grow(){
        //            Object[] newArr = new Object[elementData.length*2];
        //            for(int i=0;i<size;i++){
        //                newArr[i] = elementData[i];
        //            }
        //            elementData = newArr;
                    elementData = Arrays.copyOf(elementData,elementData.length*2);
            }
        
            public int size(){
                return size;
            }
        
            public boolean isEmpty(){
                return size==0;
            }
        
            public Object get(int i){
                if(i<0 || i>=size){
                    throw new MyArrayIndexOutofBoundsException("数组越界异常!");
                }
                return elementData[i];
            }
        
            public String toString(){
                if(size==0){
                    return "[]";
                }
                StringBuilder builder = new StringBuilder("[");
                for(int i=0;i<size;i++){
                    if(i==size-1) {
                        builder.append(elementData[i]);
                    }else{
                        builder.append(elementData[i]+",");
                    }
                }
                builder.append("]");
                return builder.toString();
            }
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值