ArrayList 和 Linkedlist

1. ArrayList 的介绍

  • ArrayList底层使用的是动态数组

  • ArrayList初始化不指定大小时,默认初始容量是10,并且只有当第一次添加数据的时候,才会初始化容量为10

  • ArrayList每次进行扩容变为原来数组的1.5倍,每次扩容都需要进行数组拷贝

  • 当前使用的容量+1超过数组长度时,会触发扩容机制,确保数组能够存下下一个数据

2.Linkedlist 的介绍

  • Linkedlist底层使用的是双向链表的数据结构

  • 在内存上不连续

3. ArrayList list = new ArrayList(10) 中的list扩容了几次

扩容了0次

这条语句只是声明和实例了一个ArrayList,指定了初始容量为10,没有扩容

4. ArrayList 和 数组直接怎样转换

ArrayList 转 数组

  • 使用 List 的 toArray() 方法即可

  •     public static void main(String[] args) {
            List<String> list1 = new ArrayList<>();
            list1.add("1");
            list1.add("2");
            list1.add("3");
            //传入初始化数组的长度,返回该对象的数组,否则返回Object类型的数组
            String[] array1 = list1.toArray(new String[list1.size()]);
        }

  • List转为数组后,如果改变原来List的元素,转为的数组不受影响

数组转ArrayList

  • 使用Arrays.asList即可

  •   public static void main(String[] args) {
            String[] array = {"a","b","c"};
            List<String> list = Arrays.asList(array);
        }    
  • 数组转为List后,改变原数组,转为的List也随之改变

5.ArrayList 和 Linkedlist的区别

  • 底层结构不同

    • ArrayList 底层由动态数组实现

    • Linkedlist 底层由双向链表实现

  • 操作数据效率不同

    • ArrayList 按照下标查询时间复杂度是O(1),Linkedlist 不支持下标查询

    • 查找时的时间复杂度都是O(n),都需要遍历

    • ArrayList 尾部插入删除,时间复杂度是O(1),其他地方插入删除,时间复杂度是O(n)

    • LinkedList 头节点插入删除是O(1),其他节点插入删除,时间复杂度是O(n)

  • 内存空间占用不同

    • ArrayList 内存连续,节省内存

    • Linkedlist 是双向链表,需要额外的空间存储指针,更占空间

  • 线程安全

    • 都是线程不安全的

    • 如果保证线程安全,在方法内使用局部变量

    • 使用线程安全的ArrayList 和 Linkedlist

    •  public static void main(String[] args) {
              List<Object> arrayList = Collections.synchronizedList(new ArrayList<>());
              List<Object> linkedList = Collections.synchronizedList(new LinkedList<>());
          }

  • 37
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值