Java面试集-基础-List集合

作者: Hibug | 来源:发表于2019-10-09 18:00 被阅读0次

Vector和ArrayList区别,代码是完全一样的,不同的是:

  1. Vector的add方法加了synchronized
  2. Vector扩容时增长1倍,ArrayList扩容增长50%。

ArrayList

数据结构:使用数组存放数据


  1. JDK1.6之前是初始化时扩容。JDK1.7是在add方法中扩容,默认是10,扩容时为旧数值的1.5倍。

  2. 线程是不安全的原因是因为size是静态变量。

    public boolean add(E e) {
    /**
     * 添加一个元素时,做了如下两步操作
     * 1.判断列表的capacity容量是否足够,是否需要扩容
     * 2.真正将元素放在列表的元素数组里面
     */
     
     //注意:静态变量size,第一次调用add时为0,第二次为1,因为是后加1
        ensureCapacityInternal(size + 1);  
        //多线程并发时,size可能被其他线程变更过
        elementData[size++] = e;
        return true;
    }
    
  3. add方法扩容的代码

    private void grow(int minCapacity) {
        //源数据的长度
        int oldCapacity = elementData.length;
        //新长度 = 源数据长度+源数据长度的1.5倍数值.
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //新长度-最小扩容长度
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        //参数1:为源数组,参数2:新数组长度
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    
  4. remove方法的核心代码

    System.arrayCopy(Object src,  int  srcPos,Object dest, int destPos,                            int length)
    

    src - 源数组。
    srcPos - 源数组中的起始位置。
    dest - 目标数组。
    destPos - 目标数据中的起始位置。
    length - 要复制的数组元素的数量。

    remove索引是高效的
    remove性能有问题:for循环比较对象,再调用删除索引的方法

Vector

与ArrayList底层代码完全一致,除了synchronized,和数组扩增不同以外。

相关文章

  • java集合框架List了解多少

    第1集 编程语⾔⾯试题之新版javase集合框架List基础篇简介:java集合框架⾥⾯List常⻅基础⾯试题考查...

  • Java面试集-基础-List集合

    Vector和ArrayList区别,代码是完全一样的,不同的是:Vector的add方法加了synchroniz...

  • Java基础汇总

    [ 面试题 ] java基础 面试 | java基础 最近5年133个Java面试问题列表 40个Java集合面试...

  • Java面试题目录

    垃圾回收 面试题-Java基础-垃圾回收 java垃圾回收 集合 40个Java集合面试问题和答案 Java集合框...

  • Java面试题目录

    垃圾回收 面试题-Java基础-垃圾回收 java垃圾回收 集合 40个Java集合面试问题和答案 Java集合框...

  • 数组和链表的区别

    JAVA面试中经常会被问到集合,集合必说的就是List,List又会讲到两种实现:ArrayList,Linked...

  • Java集合面试问题

    Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点。在本文中,列出了一些关于Java集...

  • Java面试集-基础-HashMap集合

    数据结构 JDK1.7 是数组+链表:链表是单向链表,新添加的节点在前面。JDK1.8 是红黑树。 hashCod...

  • 培训文档

    java基础 集合List:ArrayList,LinkedListSet:HashSet,Li...

  • 集合三兄弟List,Set,Map傻傻理不清?掌握诀窍面面俱到!

    前言: 作为Java基础知识的核心部分,集合方面是面试时的重中之重,List、Set、map等相信大家都不会陌生,...

网友评论

    本文标题:Java面试集-基础-List集合

    本文链接:https://www.haomeiwen.com/subject/jkngpctx.html