java list.addAll方法的一些使用记录

本文通过实例测试,探讨了Java中List.addAll()方法的工作原理。文章指出,此方法对两个列表进行操作时执行的是深拷贝,但如果列表元素为实现了序列化的自定义类,则拷贝变为浅拷贝。

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


今天做同步排序的时候,要对所有的record进行相应的处理然后排序实现ZAKER中的某些功能,使用到LIst.addAll方法,但是不懂addall是浅拷贝还是深拷贝,于是写demo测试;

结果:List list1;  List list2;   list1.addAll(list2);对于两list而言,进行的是深拷贝,即对list2进行clear不会影响list1;但是若list里面存放的是自定义的类的时候,该类型实现了序列化接口,对于该自定义的类进行的确实浅拷贝,也就是说,当执行addAll操作后,对list2中的数据进行修改也会影响到list1的数据;

package com.example.kucun2.DataPreserver; import android.content.Context; import android.content.SharedPreferences; import android.util.Log; import com.example.kucun2.entity.*; import com.example.kucun2.entity.RefTo; import com.example.kucun2.entity.RefType; import com.example.kucun2.entity.data.SynchronizableEntity; import com.google.gson.*; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; public class DataExporter { private final DataStore dataStore; public DataExporter(DataStore dataStore) { this.dataStore = dataStore; } public String exportToJson() { ExportData exportData = new ExportData(); exportData.bancais = new ArrayList<>(dataStore.bancais.getViewList()); exportData.caizhis = new ArrayList<>(dataStore.caizhis.getViewList()); exportData.mupis = new ArrayList<>(dataStore.mupis.getViewList()); exportData.chanpins = new ArrayList<>(dataStore.chanpins.getViewList()); exportData.chanpin_zujians = new ArrayList<>(dataStore.chanpin_zujians.getViewList()); exportData.dingdans = new ArrayList<>(dataStore.dingdans.getViewList()); exportData.dingdan_chanpins = new ArrayList<>(dataStore.dingdan_chanpins.getViewList()); exportData.dingdan_bancais = new ArrayList<>(dataStore.dingdan_bancais.getViewList()); exportData.kucuns = new ArrayList<>(dataStore.kucuns.getViewList()); exportData.zujians = new ArrayList<>(dataStore.zujians.getViewList()); exportData.users = new ArrayList<>(dataStore.users.getViewList()); exportData.jinhuos = new ArrayList<>(dataStore.jinhuos.getViewList()); Gson gson = new GsonBuilder() .registerTypeAdapter(SynchronizableEntity.class, new SmartEntitySerializer()) .setPrettyPrinting() .create(); return gson.toJson(exportData); } public void importFromJson(String json, Context context) { Gson gson = new GsonBuilder() .registerTypeAdapter(SynchronizableEntity.class, new SmartEntityDeserializer()) .create(); ExportData importData = gson.fromJson(json, ExportData.class); clearDataStorePreservingDefaults(); addAllToDataStore(importData); saveToPreferences(context, json); } private void clearDataStorePreservingDefaults() { preserveDefaults(dataStore.bancais); preserveDefaults(dataStore.caizhis); preserveDefaults(dataStore.mupis); preserveDefaults(dataStore.chanpins); preserveDefaults(dataStore.chanpin_zujians); preserveDefaults(dataStore.dingdans); preserveDefaults(dataStore.dingdan_chanpins); preserveDefaults(dataStore.dingdan_bancais); preserveDefaults(dataStore.kucuns); preserveDefaults(dataStore.zujians); preserveDefaults(dataStore.users); preserveDefaults(dataStore.jinhuos); } private <T extends SynchronizableEntity> void preserveDefaults(SynchronizedList<T> list) { List<T> preserved = new ArrayList<>(); for (T entity : list.getViewList()) { if (entity.getId() == -1) { preserved.add(entity); } } list.getViewList().clear(); list.getViewList().addAll(preserved); } private void addAllToDataStore(ExportData data) { dataStore.bancais.getViewList().addAll(data.bancais); dataStore.caizhis.getViewList().addAll(data.caizhis); dataStore.mupis.getViewList().addAll(data.mupis); dataStore.chanpins.getViewList().addAll(data.chanpins); dataStore.chanpin_zujians.getViewList().addAll(data.chanpin_zujians); dataStore.dingdans.getViewList().addAll(data.dingdans); dataStore.dingdan_chanpins.getViewList().addAll(data.dingdan_chanpins); dataStore.dingdan_bancais.getViewList().addAll(data.dingdan_bancais); dataStore.kucuns.getViewList().addAll(data.kucuns); dataStore.zujians.getViewList().addAll(data.zujians); dataStore.users.getViewList().addAll(data.users); dataStore.jinhuos.getViewList().addAll(data.jinhuos); } public void saveToPreferences(Context context, String json) { SharedPreferences prefs = context.getSharedPreferences("DataStore", Context.MODE_PRIVATE); prefs.edit().putString("jsonData", json).apply(); } public void loadFromPreferences(Context context) { SharedPreferences prefs = context.getSharedPreferences("DataStore", Context.MODE_PRIVATE); String json = prefs.getString("jsonData", null); if (json != null) { importFromJson(json, context); } } private static class SmartEntitySerializer implements JsonSerializer<SynchronizableEntity> { @Override public JsonElement serialize(SynchronizableEntity src, Type type, JsonSerializationContext context) { JsonObject json = new JsonObject(); json.addProperty("id", src.getId()); json.addProperty("className", src.getClass().getName()); // 其他字段序列化... return json; } } private static class SmartEntityDeserializer implements JsonDeserializer<SynchronizableEntity> { @Override public SynchronizableEntity deserialize(JsonElement json, Type type, JsonDeserializationContext context) { JsonObject obj = json.getAsJsonObject(); String className = obj.get("className").getAsString(); try { Class<?> clazz = Class.forName(className); SynchronizableEntity entity = (SynchronizableEntity) clazz.newInstance(); entity.setId(obj.get("id").getAsInt()); // 其他字段反序列化... return entity; } catch (Exception e) { return null; } } } static class ExportData { public List<Bancai> bancais; public List<Caizhi> caizhis; public List<Mupi> mupis; public List<Chanpin> chanpins; public List<Chanpin_Zujian> chanpin_zujians; public List<Dingdan> dingdans; public List<Dingdan_Chanpin> dingdan_chanpins; public List<Dingdan_bancai> dingdan_bancais; public List<Kucun> kucuns; public List<Zujian> zujians; public List<User> users; public List<Jinhuo> jinhuos; } } 详细注释
最新发布
06-25
### Java 将列表所有元素添加到集合 在Java中,可以利用`addAll()`方法来实现将一个列表的所有元素一次性添加至集合的操作。对于这一操作而言,目标容器是一个`Set`类型的集合,源数据则来自一个`List`类型的列表。 ```java import java.util.*; public class AddAllExample { public static void main(String[] args) { // 创建并填充playerList List<String> playerList = new ArrayList<>(); playerList.add("Player1"); playerList.add("Player2"); playerList.add("Player3"); // 初始化playerSet Set<String> playerSet = new HashSet<>(); // 使用addAll()方法将playerList中的全部元素加入到playerSet里 playerSet.addAll(playerList); // 输出结果以验证操作成功与否 System.out.println("Elements in the set after adding all elements from list:"); for (String element : playerSet) { System.out.println(element); } } } ``` 此代码片段展示了如何创建两个不同类型的集合——一个是`ArrayList`形式的列表,另一个是`HashSet`形式的集合;接着通过调用`addAll()`函数实现了前者向后者的数据迁移过程[^2]。需要注意的是,在这个过程中由于`Set`不允许重复项存在,因此即使原列表中有相同元素也只会被记录一次。 #### 关键特性说明: - `addAll()`能够高效地处理大批量数据转移的任务; - 当源为有序结构(如`List`),而目的地是非有序结构(如`Set`)时,最终得到的结果不会保留原有的排列顺序; - 如果尝试添加已经存在于`Set`里的项目,则该次插入会被忽略掉,从而保持唯一性的约束条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值