gpt4 book ai didi

java - Arrays.asList(array) 和 new ArrayList(Arrays.asList(array)) 的区别

转载 作者:IT老高 更新时间:2023-10-28 11:27:45 26 4
gpt4 key购买 nike

有什么区别

  • List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(ia)); // Copy

  • List<Integer> list2 = Arrays.asList(ia);

,其中 ia是整数数组吗?

我知道list2中有些操作是不允许的.为什么会这样?它是如何存储在内存中的(引用/复制)?

当我随机排列列表时,list1不影响原始数组,但 list2做。但是还是list2有点困惑。

ArrayList 怎么样?被向上转换到列表不同于创建一个新的 ArrayList ?

list1 differs from (1)
ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(ia));

最佳答案

  1. 首先,让我们看看这是做什么的:

    Arrays.asList(ia)

    它需要一个数组ia并创建一个实现 List<Integer> 的包装器,这使得原始数组可作为列表使用。没有复制任何内容,只创建了一个包装器对象。列表包装器上的操作被传播到原始数组。这意味着如果你打乱列表包装器,原始数组也会被打乱,如果你覆盖一个元素,它会在原始数组中被覆盖,等等。当然,有些 List包装器上不允许进行操作,例如从列表中添加或删除元素,您只能读取或覆盖元素。

    请注意,列表包装器不会扩展 ArrayList - 这是一种不同的物体。 ArrayList s 有自己的内部数组,在其中存储元素,并且能够调整内部数组的大小等。包装器没有自己的内部数组,它只会将操作传播到给定的数组。

  2. 另一方面,如果您随后创建一个新数组为

    new ArrayList<Integer>(Arrays.asList(ia))

    然后你创建新的ArrayList ,它是原始版本的完整、独立副本。虽然在这里您使用 Arrays.asList 创建包装器同样,它仅在构建新的 ArrayList 期间使用。并在之后被垃圾收集。这个新的结构ArrayList完全独立于原始数组。它包含相同的元素(原始数组和这个新的ArrayList 在内存中引用相同的整数),但它创建了一个新的内部数组来保存引用。所以当你对其进行shuffle、添加、删除元素等操作时,原来的数组是不变的。

关于java - Arrays.asList(array) 和 new ArrayList<Integer>(Arrays.asList(array)) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16748030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com