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

List中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);

或参考
深克隆浅克隆案例

上一篇:力扣-118题(Java)-注意List写法


下一篇:真实有效户口本怎么办