集合-List接口常用实现类的对比

1.collection接口:单列集合,用来存储一个一个的对象

2. list接口:存储有序的、可重复的数据。 --->"动态数组",替换原有的数组

    (1) Arraylist:作为list接口的主要实现类,底层使用Object数组 elementData存储


底层源码分析:
    jdk7:
        ArrayList list = new ArrayList ();底层创建了一个容量为10的数组
        list.add(123)//elementData[0] = new Interger(123);
         ...
        list.add(11)//如果此次导致添加底层elementData数组容量不够,则扩容。默认情况下,扩容为原来容量的1.5倍,同时需要将原有的数组中的数据复制到新的数组中
    结论:建议开发中使用代参的构造器:ArrayList list = new ArrayList (int capacity)

    jak8中ArrayList的变化
        ArrayList list = new ArrayList ();//底层Object[] elementData 初始化为{},并没有创建初始长度为10的数组
         list.add(123):第一次调用add()时,底层才创建了长度为10的数组,并将数据123天假到elementData[0]
        ...
        list.add(11)//如果此次导致添加底层elementData数组容量不够,则扩容。默认情况下,扩容为原来容量的1.5倍,同时需要将原有的数组中的数据复制到新的数组中
    小结:jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象的创建类似于懒汉式,延迟了数组的创建,节省内存。

在jdk1.8中一开始创建的数组中什么数据也没有

    (2)LinkedList:对于频繁的插入、删除操作,使用此类比Arraylist效率高,底层使用双向链表存储
源码分析:

LinkedList list = new LinkedList()//内部声明了node类型的first和last属性,默认为空

list.add(123)将123封装到node中,创建了node对象其中Node定义为下图所示:体现了linkedList的双向链表的说法

添加数据

     (3)Vector :作为list接口的古老实现类,底层使用Object数组 elementData存储

posted @ 2022-07-12 09:36  剑断青丝ii  阅读(111)  评论(0编辑  收藏  举报