社交媒体

ArrayList与LinkedList

ArrayList与LinkedList

钩子:数组的两大痛点

第 12 篇学过数组,用久了你会发现两个难受的地方:

  1. 长度定死:new int[10] 就是 10 个,装满了不能扩,装太少浪费;
  2. 插入麻烦:想在中间插一个元素?后面所有元素手动后移,代码写得手酸。

Java 的答案:集合(Collection)——会自动扩容、自带增删方法的"高级数组"。最常用的就是 ArrayList。

核心:ArrayList 上手三分钟

import java.util.ArrayList;

ArrayList<String> list = new ArrayList<>();
list.add("橙码酱");         // 尾部追加
list.add("Java");
list.add("真棒");

list.add(1, "Spring");      // 指定位置插入
list.remove(0);             // 按下标删
list.set(0, "Java教程");    // 改

System.out.println(list.size());        // 3,不用自己数
System.out.println(list.get(0));        // 取
System.out.println(list.contains("Java")); // 查有没有

for (String s : list) {                 // 增强 for 遍历
    System.out.println(s);
}

自动扩容、自动管理,数组时代的按 index 手动搬元素一去不返。这就是你以后 90% 场景用的容器。

面试重点:ArrayList 和 LinkedList 的区别

两个都是 List,性格截然不同——底层结构决定一切:

  • ArrayList:底层是数组。连续内存,按下标定位一步到位(get(i) 飞快);但中间插入/删除,后面元素整体后移/前移,代价大;
  • LinkedList:底层是链表。每个元素记着"上一个是谁、下一个是谁",中间插入/删除只需改两个指针(飞快);但按下标定位必须从头一个个数过去(get(i) 慢)。
    23-ArrayList与LinkedList结构对比图.png

一句话选型:查询多、增删少 → ArrayList;频繁头尾/中间增删 → LinkedList。拿不准就 ArrayList——实际开发里 ArrayList 的使用率碾压 LinkedList,因为"查询多"是绝大多数场景的真相。

一个必须知道的冷知识:泛型尖括号

ArrayList<String> 里的 <String> 叫泛型:规定这个容器只能装 String。装别的?编译期直接报错——比运行时才发现强一万倍。泛型后面还会细讲,今天记住"尖括号 = 类型护栏"即可。


本文示例代码均已本地实测通过,可直接运行。
对应文件:ListDemo.java


橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。