List中sublist方法内存地址指向问题
作者:互联网
SubList的使用
List接口中有subList(int fromIndex, int toIndex)方法 属于浅拷贝
会对原List产生影响,所以要慎用。
测试用例
public static void main(String[] args) {
List list = new ArrayList();
for(int i = 0; i<10 ;i++){
list.add(i);
}
System.out.println("list->"+list);
List tempList = list.subList(0, 4);
System.out.println("tempList->"+tempList);
tempList.clear();
for(int i = 2; i<5 ;i++){
tempList.add(i);
}
System.out.println("tempList->"+tempList);
System.out.println("list->"+list);
}
list->[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
tempList->[0, 1, 2, 3]
tempList->[2, 3, 4]
list->[2, 3, 4, 4, 5, 6, 7, 8, 9]
SubList在使用中常遇到的问题
- SubList不能被序列化
- 对子SubList的增删导致原List的数据变化
- 对原List的增删会导致子SubList的的操作抛出并发修改异常
- 不能对SubList强制转型为原类型,比如LinkedList或者ArrayList,会抛出类转换异常
SubList截取的数据是指向了被截取集合的内存地址
解决:进行拷贝。若有对象或引用类型则需进行深拷贝,否则可用浅拷贝
JSON.parse(JSON.stringify()) 实现对对象的深拷贝
就是利用JSON.stringify 将对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象;序列化的作用是存储
List<Object> list = new ArrayList<>();
List<Object> sublist = list.subList(0, 5);
String arrJson = JSON.toJSONString(sublist);
List<Object> tempList = JSON.parseArray(arrJson,T.class);
或参考
深克隆浅克隆案例
标签:序列化,List,list,sublist,SubList,JSON,内存地址,tempList 来源: https://blog.csdn.net/qq_36296417/article/details/114011884