List中的set方法和add方法

本文通过一个具体的Java程序示例,详细解释了List接口中set与add方法的区别及用法。set方法用于替换指定位置的元素并返回被替换的元素,而add方法则在指定位置插入一个元素,并将后续元素向后移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[LeetCode]–119. Pascal’s Triangle II

在做这个题的时候,我发现了一个list初始化的问题。就是set必须是new出来的具体list初始化之后才能使用,不然就会报错。下面就研究一下set和add。

package yanning;

import java.util.LinkedList;
import java.util.List;

public class TestListSet {
    public static void main(String[] args) {
        List l1 = new LinkedList();
        for (int i = 0; i <= 5; i++) {
            l1.add("a" + i);
        }
        System.out.println(l1);
        l1.add(3, "a100");
        System.out.println(l1);
        String b = (String) l1.set(3, "a200");
        System.out.println(b);
        System.out.println(l1);

    }
}

这里写图片描述

看了运行截图基本一目了然:

add方法是在某个指定的位置加上某个对象,并将原来的位置的那个对象向后挤了一格。

set方法是将原来位置上的那个给取代了,并将原来位置上对象的返回。

<think>我们正在讨论Java中Listadd()方法。根据引用[1]引用[2],Listadd方法用于向列表中添加元素。下面我将详细解释add方法的使用。 在Java中,List接口提供了多个add方法的重载,用于向列表中添加元素。最常用的有两种形式: 1. `boolean add(E e)`:将指定的元素追加到此列表的末尾。 2. `void add(int index, E element)`:将指定的元素插入此列表中的指定位置。 下面我们通过示例代码来详细说明这两种方法的使用。 ### 1. 在列表末尾添加元素(`boolean add(E e)`) ```java import java.util.ArrayList; import java.util.List; public class ListAddExample { public static void main(String[] args) { // 创建一个ArrayList List<String> list = new ArrayList<>(); // 使用add(E e)方法在列表末尾添加元素 list.add("Apple"); list.add("Banana"); list.add("Orange"); // 打印列表 System.out.println(list); // 输出: [Apple, Banana, Orange] } } ``` ### 2. 在指定位置插入元素(`void add(int index, E element)`) ```java import java.util.ArrayList; import java.util.List; public class ListAddAtIndexExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); // 在索引1的位置(即第二个位置)插入"Grape" list.add(1, "Grape"); System.out.println(list); // 输出: [Apple, Grape, Banana, Orange] } } ``` ### 注意事项 1. **索引范围**:使用`add(int index, E element)`时,索引`index`必须在0当前列表大小(包含)之间。也就是说,`index`的有效范围是`[0, size()]`。如果索引超出这个范围,将抛出`IndexOutOfBoundsException`。 示例: ```java // 错误的索引 list.add(5, "Mango"); // 如果当前列表大小小于5,将抛出异常 ``` 2. **容量问题**:对于`ArrayList`,当添加元素时,如果内部数组已满,则会自动扩容(通常扩容为原来的1.5倍)。而`LinkedList`则没有容量限制,因为它是链表结构。 3. **返回值**:`boolean add(E e)`方法总是返回`true`(因为List允许重复元素,所以添加操作总是成功的)。这与`Set`的`add`方法不同,`Set`的`add`方法可能会因为元素已存在而返回`false`。 4. **允许null重复元素**:List允许添加null元素,也允许添加重复元素。 示例: ```java List<String> list = new ArrayList<>(); list.add(null); // 添加null list.add("Apple"); list.add("Apple"); // 重复元素 System.out.println(list); // 输出: [null, Apple, Apple] ``` ### 不同List实现类的性能考虑 - **ArrayList**:在列表末尾添加元素(`add(E e)`)的时间复杂度是$O(1)$(分摊时间,因为可能涉及扩容)。在列表中间或开头插入元素(`add(int index, E element)`)需要移动元素,时间复杂度为$O(n)$。 - **LinkedList**:在列表末尾添加元素(`add(E e)`)的时间复杂度是$O(1)$。在指定位置插入元素(`add(int index, E element)`)需要先遍历到指定位置(时间复杂度$O(n)$),然后插入操作是$O(1)$。 因此,如果频繁在列表中间插入元素,使用`LinkedList`可能更高效。 ### 示例:比较ArrayListLinkedList的插入性能 ```java import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class PerformanceComparison { public static void main(String[] args) { int size = 100000; // ArrayList在末尾添加 List<Integer> arrayList1 = new ArrayList<>(); long start = System.currentTimeMillis(); for (int i = 0; i < size; i++) { arrayList1.add(i); // 在末尾添加 } long end = System.currentTimeMillis(); System.out.println("ArrayList在末尾添加" + size + "个元素耗时: " + (end - start) + "ms"); // ArrayList在开头添加 List<Integer> arrayList2 = new ArrayList<>(); start = System.currentTimeMillis(); for (int i = 0; i < size; i++) { arrayList2.add(0, i); // 在开头添加 } end = System.currentTimeMillis(); System.out.println("ArrayList在开头添加" + size + "个元素耗时: " + (end - start) + "ms"); // LinkedList在末尾添加 List<Integer> linkedList1 = new LinkedList<>(); start = System.currentTimeMillis(); for (int i = 0; i < size; i++) { linkedList1.add(i); // 在末尾添加 } end = System.currentTimeMillis(); System.out.println("LinkedList在末尾添加" + size + "个元素耗时: " + (end - start) + "ms"); // LinkedList在开头添加 List<Integer> linkedList2 = new LinkedList<>(); start = System.currentTimeMillis(); for (int i = 0; i < size; i++) { linkedList2.add(0, i); // 在开头添加 } end = System.currentTimeMillis(); System.out.println("LinkedList在开头添加" + size + "个元素耗时: " + (end - start) + "ms"); } } ``` 运行结果可能类似于: ``` ArrayList在末尾添加100000个元素耗时: 10ms ArrayList在开头添加100000个元素耗时: 1500ms LinkedList在末尾添加100000个元素耗时: 15ms LinkedList在开头添加100000个元素耗时: 20ms ``` ### 总结 - 使用`add(E e)`在列表末尾添加元素。 - 使用`add(int index, E element)`在指定位置插入元素。 - 注意索引的有效范围(0到size())。 - 根据实际需求选择合适的List实现类(ArrayList或LinkedList)以优化性能。 §§相关问题§§ 1. Java中Listset()方法有什么作用? 2. 如何从List中删除元素? 3. ArrayListLinkedList在内存使用上有何区别? 4. 如何避免Listadd操作导致的并发修改异常? 5. ListaddAll()方法如何使用?</think>### Java List `add()` 方法使用详解 在 Java 中,List 接口的 `add()` 方法是向集合添加元素的核心方法,主要分为两种形式: #### 1. 在列表末尾添加元素 ```java boolean add(E e) ``` - **功能**:将元素追加到列表末尾 - **返回值**:总是返回 `true`(因为 List 允许重复元素) - **示例**: ```java List<String> fruits = new ArrayList<>(); fruits.add("Apple"); // ["Apple"] fruits.add("Banana"); // ["Apple", "Banana"] fruits.add(null); // 允许添加 null ["Apple", "Banana", null] ``` #### 2. 在指定位置插入元素 ```java void add(int index, E element) ``` - **功能**:在指定索引位置插入元素 - **注意事项**: - 索引必须满足:$0 \leq \text{index} \leq \text{size()}$ - 索引越界会抛出 `IndexOutOfBoundsException` - **示例**: ```java List<String> colors = new ArrayList<>(); colors.add("Red"); // ["Red"] colors.add("Blue"); // ["Red", "Blue"] colors.add(1, "Green"); // 在索引1插入 ["Red", "Green", "Blue"] ``` #### 关键特性说明 1. **支持重复元素**: ```java list.add("A"); list.add("A"); // 允许重复 ["A", "A"] ``` 2. **允许 null 值**: ```java list.add(null); // 合法操作 ``` 3. **动态扩容**: - ArrayList 自动扩容(默认扩容1.5倍) - LinkedList 无容量限制 4. **时间复杂度**: - ArrayList: - 末尾添加:$O(1)$(分摊时间) - 中间插入:$O(n)$(需要移动元素) - LinkedList: - 末尾添加:$O(1)$ - 中间插入:$O(n)$(需要遍历到位置) #### 不同 List 实现的对比 | 操作 | ArrayList | LinkedList | |--------------------|-----------------|-----------------| | `add(e)` (末尾) | $O(1)$ 分摊时间 | $O(1)$ | | `add(index, e)` | $O(n)$ | $O(n)$ | | 内存占用 | 连续内存 | 分散内存+指针 | #### 使用示例:对象列表操作 ```java class Product { private int id; private String name; public Product(int id, String name) { this.id = id; this.name = name; } } List<Product> products = new ArrayList<>(); products.add(new Product(1, "Laptop")); // 添加对象 products.add(0, new Product(2, "Phone")); // 在开头插入 ``` #### 注意事项 1. **并发修改**: ```java // 遍历时修改会抛出 ConcurrentModificationException for (String item : list) { if (item.equals("A")) { list.add("B"); // 危险操作! } } ``` 2. **容量预分配**(针对 ArrayList): ```java // 优化:预先分配容量避免频繁扩容 List<String> largeList = new ArrayList<>(1000); ``` 3. **索引验证**: ```java // 安全写法:检查索引范围 if (index >= 0 && index <= list.size()) { list.add(index, element); } ``` #### 与 Set 的差异 | 特性 | Listadd() | Setadd() | |--------------|------------------------|------------------------| | 允许重复 | ✓ | ✗ | | 允许 null | ✓ | 取决于实现类 | | 返回值含义 | 总是 true | 元素不存在时返回 true | | 元素顺序 | 保持插入顺序 | 不保证顺序 | > List 作为 Java 集合框架中最基础的数据结构,其 `add()` 方法的正确使用是开发高效 Java 程序的基础[^2]。理解不同实现的底层原理有助于在特定场景做出最优选择[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值