Java初学者 List 操作全攻略:轻松掌握

📅 2026/7/6 4:35:47
Java初学者 List 操作全攻略:轻松掌握
Java List 入门指南从零开始掌握列表操作本文面向 Java 初学者用通俗易懂的方式讲解List的核心概念和常用操作。一、什么是 List想象你去超市购物手里拿着一张购物清单1. 牛奶 2. 面包 3. 鸡蛋 4. 苹果这张清单有几个特点有序第一项是牛奶第二项是面包顺序是固定的可重复你可以写两瓶牛奶可随时增减走到半路可以加一项酸奶也可以划掉鸡蛋Java 中的List就是这样一种数据结构——有序、可重复、可动态增减的集合。二、List 是一个接口在 Java 中List是一个接口Interface它定义了列表应该有哪些能力但本身不能直接new。我们常用的实现类有两个实现类特点适用场景ArrayList底层数组实现查询快增删慢绝大多数场景的首选LinkedList底层链表实现增删快查询少频繁在头部插入/删除时使用初学者记住不确定用什么的时候选ArrayList就对了。三、创建一个 Listimportjava.util.ArrayList;importjava.util.List;publicclassListDemo{publicstaticvoidmain(String[]args){// 创建一个存放字符串的 ArrayListListStringfruitsnewArrayList();System.out.println(fruits);// 输出: []}}几个关键点ListString中的String叫泛型表示这个列表只能放String类型的数据new ArrayList()右边的可以留空菱形语法编译器会自动推断类型创建后默认是空列表[]四、List 的常用操作CRUD4.1 添加元素 —add()ListStringfruitsnewArrayList();fruits.add(苹果);// 添加到末尾fruits.add(香蕉);fruits.add(橘子);fruits.add(1,葡萄);// 在索引 1 的位置插入System.out.println(fruits);// 输出: [苹果, 葡萄, 香蕉, 橘子]⚠️注意索引从 0 开始第一个元素的索引是0第二个是1以此类推。4.2 访问元素 —get()Stringfirstfruits.get(0);// 获取第一个元素Stringsecondfruits.get(1);// 获取第二个元素System.out.println(第一个: first);// 第一个: 苹果System.out.println(第二个: second);// 第二个: 葡萄4.3 获取大小 —size()System.out.println(列表里有 fruits.size() 种水果);// 输出: 列表里有 4 种水果 是size()而不是length数组用.lengthList 用.size()别搞混了。4.4 修改元素 —set()fruits.set(0,西瓜);// 把索引 0 的元素改为西瓜System.out.println(fruits);// 输出: [西瓜, 葡萄, 香蕉, 橘子]4.5 删除元素 —remove()fruits.remove(葡萄);// 按内容删除删除第一个匹配项fruits.remove(0);// 按索引删除System.out.println(fruits);// 输出: [香蕉, 橘子]⚠️小心歧义remove(1)会被当作删除索引 1 的元素而不是删除值为 1 的元素。如果要删除整数用remove(Integer.valueOf(1))。4.6 查找元素 —contains()和indexOf()ListStringfruitsnewArrayList();fruits.add(苹果);fruits.add(香蕉);fruits.add(橘子);// 判断是否包含某个元素booleanhasApplefruits.contains(苹果);System.out.println(有苹果吗hasApple);// 有苹果吗true// 查找元素的索引位置intindexfruits.indexOf(香蕉);System.out.println(香蕉在索引: index);// 香蕉在索引: 1// 不存在时返回 -1intnotFoundfruits.indexOf(芒果);System.out.println(芒果在索引: notFound);// 芒果在索引: -1五、遍历 List三种方式这是最常用的操作之一——逐个访问列表中的元素。方式一for 循环经典写法for(inti0;ifruits.size();i){System.out.println(第(i1)个: fruits.get(i));}适合需要用到索引的场景。方式二增强 for 循环for-each⭐ 推荐for(Stringfruit:fruits){System.out.println(fruit);}写法简洁适合只需要读取元素的场景。方式三forEach LambdaJava 8fruits.forEach(fruit-System.out.println(fruit));更简洁也支持方法引用fruits.forEach(System.out::println);六、List 与数组的转换实际开发中经常需要在 List 和数组之间互相转换。List → 数组String[]arrfruits.toArray(newString[0]);数组 → ListString[]colors{红,绿,蓝};ListStringcolorListnewArrayList(Arrays.asList(colors));// 或者更简洁Java 9ListStringcolorList2List.of(红,绿,蓝);⚠️Arrays.asList()返回的是一个固定大小的列表不能add和remove。如果需要增删请用new ArrayList(Arrays.asList(...))包一层。七、List 的排序importjava.util.Collections;ListIntegernumbersnewArrayList();numbers.add(3);numbers.add(1);numbers.add(4);numbers.add(1);numbers.add(5);// 升序排序Collections.sort(numbers);System.out.println(numbers);// [1, 1, 3, 4, 5]// 降序排序Collections.sort(numbers,Collections.reverseOrder());System.out.println(numbers);// [5, 4, 3, 1, 1]// 字符串列表排序ListStringnamesnewArrayList();names.add(Charlie);names.add(Alice);names.add(Bob);Collections.sort(names);System.out.println(names);// [Alice, Bob, Charlie]八、常用方法速查表方法作用示例add(e)添加元素到末尾list.add(A)add(i, e)在指定位置插入list.add(0, B)get(i)获取指定位置的元素list.get(0)set(i, e)修改指定位置的元素list.set(0, C)remove(i)删除指定位置的元素list.remove(0)remove(e)删除第一个匹配的元素list.remove(A)size()获取元素个数list.size()contains(e)是否包含某元素list.contains(A)indexOf(e)查找元素索引list.indexOf(A)isEmpty()列表是否为空list.isEmpty()clear()清空所有元素list.clear()addAll(c)批量添加list.addAll(otherList)subList(from, to)截取子列表list.subList(0, 2)九、容易踩的坑坑 1遍历时删除元素// ❌ 错误写法会抛出 ConcurrentModificationExceptionfor(Stringfruit:fruits){if(fruit.equals(苹果)){fruits.remove(fruit);}}// ✅ 正确写法使用 IteratorIteratorStringitfruits.iterator();while(it.hasNext()){if(it.next().equals(苹果)){it.remove();}}// ✅ 正确写法使用 removeIfJava 8fruits.removeIf(fruit-fruit.equals(苹果));坑 2List 存的是引用ListListStringmatrixnewArrayList();ListStringrownewArrayList();row.add(A);matrix.add(row);row.set(0,B);System.out.println(matrix.get(0).get(0));// 输出: B也被改了因为matrix和row指向同一个对象。如果不想互相影响需要深拷贝。坑 3泛型不支持基本类型// ❌ 编译错误ListintnumsnewArrayList();// ✅ 使用包装类ListIntegernumsnewArrayList();nums.add(1);// 自动装箱int → Integerintnnums.get(0);// 自动拆箱Integer → int十、ArrayList vs LinkedList 怎么选ArrayList LinkedList 随机访问 ⭐⭐⭐ ⭐ 头部插入 ⭐ ⭐⭐⭐ 尾部插入 ⭐⭐⭐ ⭐⭐⭐ 内存占用 较少 较多额外指针结论99% 的场景用ArrayList即可。只有当你需要频繁在列表头部插入/删除时才考虑LinkedList。十一、小结List是 Java 中最常用的集合之一特点是有序、可重复、可动态增删日常开发优先使用ArrayList核心操作add、get、set、remove、size、contains遍历推荐用 for-each 或forEach注意遍历时不要直接remove用Iterator或removeIf泛型用包装类Integer而不是int练习建议打开你的 IDE照着上面的代码敲一遍亲手运行看看结果。学编程最有效的方法就是——动手写代码