sublist方法内存地址指向问题

  1. List中sublist方法内存地址指向问题
    1. SubList的使用
    2. SubList在使用中常遇到的问题
    3. SubList截取的数据是指向了被截取集合的内存地址

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截取的数据是指向了被截取集合的内存地址

img

解决:进行拷贝。若有对象或引用类型则需进行深拷贝,否则可用浅拷贝

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

×

喜欢就点赞,疼爱就打赏

相册 说点什么