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);
或参考
深克隆浅克隆案例
深拷贝 和 浅拷贝 最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)
浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。
日夜颠倒头发少 ,单纯好骗恋爱脑 ,会背九九乘法表 ,下雨只会往家跑 ,搭讪只会说你好 ---- 2050781802@qq.com