• arraylist基操和添加元素源码


    ArrayList增加

    List接口的实现类。

    底层使用数组

    查询效率高,增删效率低,不安全。

    List<String> list=new ArrayList<>();
    
    //添加元素
    list.add("bjsxt");
    list.add("puty");
    //注意下面的添加方式数组索引不得大于现有元素个数
    list.add(3,"jlhh");//此时报错
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    获取元素

    for(int i=0;i<list.size(),i++){
        sout(list.get(i));
    }
    
    • 1
    • 2
    • 3

    删除元素

    根据索引删除指定元素

    返回值是被删除的元素的值

    String value=list.remove(1);
    
    • 1

    替换元素

    String val=list.set(0,"ibts");
    
    • 1

    清空容器

    list.clear();
    
    • 1

    判断容器是否空

    list.isEmpty();
    
    • 1

    是否包含指定元素

    boolean flag=list.contains("xiaozhang");
    
    • 1

    到这里感觉特别无聊,直接跳过了一些东西。

    ArrayList底层源码

    AbstractList

    private static final int DEFAULT_CAPACITY=10;
    
    transienet Object[] elementData;
    trasient  数据持久化 不会被保存磁盘
        
    private int size;
    
    public ArrayList(){
        this.elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;  //{}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    jdk1.7 立即加载

    1.8 延迟加载 给空数组 什么时候用什么时候改变数组长度,合理使用空间。

    add方法

    核心是最后的grow方法,判断何时应该对数组做扩容。

    public boolean add(E e){
        ensureCapacityInternal(size+1);
        elementData[size++]=e;
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    private void ensureCapacityInternal (int minCapacity){
        ensureExplicitCapacity(calculateCapacity(elementData,minCapacity))
    }
    
    • 1
    • 2
    • 3
    private static int calculateCapacity(Object[] elementData,int minCapacity){
        if(elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
            return Math.max(DEFAULT_CAPACITY,minCapacity);
        }
        return minCapacity;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    private void ensureExpricitCapacity(int minCapacity){
        modCount++;
        
        if(minCapacity-elementData.length>0){
            grow(minCapacity);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    private void grow(int minCapacity){
        int oldCapacity=elementData.length;
        int newCapacity=oldCapacity+(oldCapacity>>1);
        if(newCapacity-minCapacity<0){
            newCapacity=minCapacity;
        }
        if(newCapacity-MAX_ARRAY_SIZE>0){
            newCapacity=hugeCapacity(minCapacity);
        }
        elementData=Arrays.copyOf(elementData,newCapacity);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    关于人力外包公司那些事
    k8s重启节点状态NotReady
    SpringBoot整合JWT+Vue
    FastAdmin列表实现自定义搜索及传值
    内存取证系列3
    【引语练习题】直接引语为疑问句转为间接引语时注意
    天选之子C++是如何发展起来的?如何学习C++呢?
    多测师肖sir_项目讲解
    Aspose.Words使用教程之从零创建OOXML图表
    SuperMap GIS基础软件地图瓦片问题Q&A
  • 原文地址:https://blog.csdn.net/qq_42938698/article/details/125460263