ArrayList的subList方法属于浅拷贝

本文深入探讨了ArrayList的subList方法实现原理,揭示其属于浅拷贝而非深拷贝的本质,通过具体实例验证了修改子列表会影响原列表,强调了与String.substring方法的区别。

介绍

ArrayListsubList(int fromIndex, int toIndex)方法属于浅拷贝, 用subList方法获取的List只是原List的一个View。

不同于String的substring方法,因为String是final类型, substring是创建一个新的String对象。

浅拷贝是指拷贝引用,不拷贝实际的对象,不创建新对象。如果修改拷贝出来的对象,原来的对象也会发生相应的变化。

验证

构造单测样例,验证subList方法是浅拷贝。分别给出

    @Test
    public void testSubList() throws Exception {
        List<String> list = new ArrayList<>(Arrays.asList("James is a basketball player".split(" ")));
        int orgLength = list.size();

        // test 1: 修改sub的首位元素值
        List<String> sub = list.subList(0, list.size()/2 + 1);
        sub.set(0, sub.get(0).toUpperCase());
        Assert.assertEquals(list.get(0), "JAMES");

        // test 2: sub添加一个新元素
        sub.add("not");
        Assert.assertEquals(orgLength + 1, list.size());
        System.out.println("subList: " + sub);
        System.out.println("list: " + list);

    }

输出结果如下所示,可以说明ArrayList的subList方法属于浅拷贝。

// sub
subList: [JAMES, is, a, not]

// 原始List
list: [JAMES, is, a, not, basketball, player]

参考文献

jdk1.8 ArrayList

### Java 二维 `ArrayList` 的使用方法 #### 创建二维 `ArrayList` 创建一个二维 `ArrayList` 可以通过定义泛型参数为 `ArrayList<T>` 来实现。下面是一个简单的例子来展示如何声明并初始化一个二维 `ArrayList`: ```java import java.util.ArrayList; public class TwoDArrayListExample { public static void main(String[] args) { // 声明并初始化一个二维 ArrayList ArrayList<ArrayList<Integer>> twoDimList = new ArrayList<>(); // 添加子列表到主列表中 for (int i = 0; i < 3; ++i) { twoDimList.add(new ArrayList<>()); } // 向各个子列表添加元素 twoDimList.get(0).add(1); twoDimList.get(0).add(2); twoDimList.get(1).add(3); twoDimList.get(1).add(4); twoDimList.get(2).add(5); twoDimList.get(2).add(6); } } ``` 这段代码展示了如何创建一个包含三个子列表的二维 `ArrayList` 并向这些子列表中添加整数值[^2]。 #### 访问和修改元素 访问或修改特定位置上的元素可以通过指定外层索引以及内层索引来完成。例如,要获取第一个内部列表的第一个元素可以这样做: ```java // 获取第0个子列表中的第0个元素 Integer element = twoDimList.get(0).get(0); System.out.println(element); // 输出: 1 ``` 如果想要更改某个具体的位置处的数据,则可以直接设置新值给该位置的对象引用: ```java twoDimList.get(0).set(0, 99); // 将第0个子列表中的第0个元素设为99 System.out.println(twoDimList.get(0).get(0)); // 输出: 99 ``` #### 复制二维 `ArrayList` 为了安全地复制整个结构而不只是浅拷贝顶层容器对象本身,在某些情况下可能需要深拷贝所有的嵌套集合及其所含有的元素。这里提供了一个简单的方法来进行这样的操作: ```java ArrayList<ArrayList<Integer>> copyOfTwoDimList = new ArrayList<>(secondTwoDimList.size()); for (ArrayList<Integer> innerList : secondTwoDimList) { copyOfTwoDimList.add(new ArrayList<>(innerList)); } ``` 此段代码会逐一遍历原始的二维 `ArrayList` (`secondTwoDimList`) ,并将每一个内部列表都作为新的独立副本加入到目标列表(`copyOfTwoDimList`)当中去[^1]。 #### 遍历二维 `ArrayList` 对于遍历来说,有两种常见的方式:一种是传统的基于索引的方式;另一种则是利用增强版 `for-each` 循环语法糖特性。以下是两种方式的例子: 传统索引方式: ```java for (int row = 0; row < twoDimList.size(); ++row) { for (int col = 0; col < twoDimList.get(row).size(); ++col) { System.out.print(twoDimList.get(row).get(col) + " "); } System.out.println(); } ``` 增强 `for-each` 方式: ```java for (ArrayList<Integer> sublist : twoDimList) { for (Integer item : sublist) { System.out.print(item + " "); } System.out.println(); } ``` 这两种方法都可以有效地迭代所有存储于二维 `ArrayList` 结构内的数据项[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值