List的set和add方法

本文详细介绍了List中add和set两种方法的使用。add方法包括在末尾添加元素和指定位置插入元素,其中指定位置插入要求索引连续,否则会抛出异常。set方法用于修改指定位置的元素,但前提该位置已有数据,否则会触发错误。

本文重点:

1 add--添加值;set修改值

2 add方法有不同的形式
2.1 boolean add(E e)

这种add方法添加值得时候,没有特意设置它得索引。直接安放到链表的最后面。

2.2 void add(int index,E e)

这种方法设置了值,同时还明确了索引位置。

3 在用add方法设置索引的时候,索引必须时连贯的,中间不能留空,否则报错。

而如果是下面这样:

dataSource.setParameter(new ArrayList<>());
        List<ParameterType> list = dataSource.getParameter();
        ParameterType parameterType1 = new ParameterType("1","hahha");
        ParameterType parameterType2 = new ParameterType("2","ha4hha");
        ParameterType parameterType3 = new ParameterType("h3","ha4hha");
        ParameterType parameterType4 = new ParameterType("h4","ha4hha");
        ParameterType parameterType5 = new ParameterType(null,null);


        list.add(0,parameterType1);
        list.add(parameterType4);
        list.add(1,parameterType2);
        list.add(parameterType3);

结果为:


ParameterType[name=1,va
<think>我们正在讨论的是Java中不同类的addset方法,根据引用内容,主要涉及三个不同的上下文:Memcached、CalendarList。用户想知道add方法set方法的区别,但没有指定具体是哪个类。根据之前的对话历史,用户之前询问的是Swing窗口居中问题,而当前引用内容涉及Memcached、CalendarList。因此,我们需要分别解释这三个类中addset方法的区别。 由于引用提供了三个不同的场景,我们需要分别说明: 1. Memcached中的addset方法(引用[1]) 2. Calendar中的addset方法(引用[2]) 3. List(特别是LinkedList)中的addset方法(引用[3]) 另外,引用[4]中Setadd方法的使用只是一个示例,但我们也需要说明Setadd方法的特点。 因此,回答将分为四个部分: 1. Memcached中XMemcachedClient的addset方法 2. Calendar类中的addset方法 3. List接口的addset方法 4. Set接口的add方法(因为引用[4]提到了Setadd方法) 注意:用户的问题没有限定具体类,所以我们需要覆盖这些不同的上下文。 下面开始组织回答: </think>### 📚 `add`方法与`set`方法的核心区别详解 在不同Java组件中,`add()``set()`方法有本质差异,具体行为取决于调用的类对象。以下是按场景分类的对比分析: --- #### 1. **`Calendar`类(日期操作)** 引用场景:[^2] ```java Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, 2); // ✅ 当前日期+2天 cal.set(Calendar.DAY_OF_MONTH, 2); // ❌ 直接设为当月2号(无视原值) ``` | 方法 | 作用原理 | 示例结果(假设原日期为15号) | |--------|---------------------------|------------------------------| | `add` | **增量修改**:在原值基础上加减 | 15 + 2 = 17号 | | `set` | **覆盖赋值**:直接替换字段值 | 强制设为2号(结果=2号) | > **关键区别**:`add`是相对操作,`set`是绝对覆盖[^2] --- #### 2. **`List`接口(集合操作)** 引用场景:[^3] ```java List<Integer> list = new LinkedList<>(); list.add(0, 50); // 索引0插入50 → [50] list.set(0, 100); // 替换索引0的值 → [100] ``` | 方法 | 作用原理 | 前提条件 | 返回值 | |------------|---------------------------|------------------------|----------------| | `add(int index, E elem)` | **插入元素**:指定位置添加新元素 | 索引需满足 `0 ≤ index ≤ size()` | `void` | | `set(int index, E elem)` | **替换元素**:修改已有位置元素值 | 索引必须满足 `0 ≤ index < size()` | 被替换的旧元素 | > ⚠️ 易错点: > - `add(1,100)` 在空列表会抛出 `IndexOutOfBoundsException`(因索引1>size=0) > - `set(0,100)` 在空列表同样报错(无元素可替换)[^3] --- #### 3. **`Set`接口(集合操作)** 引用场景:[^4] ```java Set<Character> charSet = new HashSet<>(); charSet.add('A'); // 添加成功 → true charSet.add('A'); // 重复添加 → false ``` | 方法 | 作用原理 | 返回值 | |-------------|--------------------------------------|---------------------| | `add(E e)` | **添加元素**:若元素不存在则插入 | `true`(成功)/`false`(重复) | | `Set`无`set`方法 | ❌ 不支持按索引修改(无序集合特性) | - | > **设计原理**:`Set`要求元素唯一性,禁止直接修改元素值(需先`remove`旧值再`add`新值) --- #### 4. **Memcached客户端(缓存操作)** 引用场景:[^1] ```java XMemcachedClient client = new XMemcachedClient(); client.add("key", 60, "value"); // 仅当key不存在时存储 client.set("key", 60, "value"); // 无论key是否存在都存储 ``` | 方法 | 作用原理 | 典型应用场景 | |-------------|-----------------------------------|----------------------| | `add()` | **安全存储**:key不存在时才存入 | 防止重复初始化数据 | | `set()` | **强制覆盖**:无论key是否存在都写入 | 数据更新操作 | > **缓存策略差异**: > `add()` 实现原子性新增,`set()` 实现幂等性更新[^1] --- ### 💎 核心区别总结表 | 操作场景 | `add()` 方法行为 | `set()` 方法行为 | 本质差异 | |----------------|---------------------------|---------------------------|------------------------| | `Calendar` | 相对增减字段值 | 绝对覆盖字段值 | **增量 vs 覆盖** | | `List` | 插入新元素 | 替换已有元素 | **新增 vs 修改** | | `Set` | 添加唯一元素 | 不支持 | **唯一性约束** | | `Memcached` | 仅当key不存在时存储 | 强制覆盖存储 | **安全创建 vs 强制更新** | --- ### ️ 通用注意事项 1. **索引边界** `list.set(index, elem)` 要求 `index < list.size()`,否则抛出 `IndexOutOfBoundsException` 2. **线程安全** 集合类的 `add/set` 方法大多非线程安全,需配合 `Collections.synchronizedList()` 或并发集合使用 3. **对象相等性** `Set.add()` 依赖 `equals()` `hashCode()` 判断重复性,需正确重写这两个方法[^4] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值