数组的一个主要特征是不变性(数组的大小不能改变),但是当我练习的时候,我发现自己是这样的:
我们有一个特定大小的数组
String[] strArr = new String[1];
和带有对象的arraylist
ArrayList<String> list = new ArrayList<>();
list.add("Alex");
list.add("Ali");
list.add("Alll");
所以当我们尝试将列表转换为数组并将其赋给strarr时,就像这样
strArr = list.toArray(strArr);
for(String str : strArr ) {
System.out.println(str);
}
即使数组的大小不等于列表的大小,它也可以正常工作
所以我只想知道这是怎么可能的,当数组的大小不能改变的时候?
3条答案
按热度按时间ilmyapht1#
已分配新阵列
strArray
第一次引用大小为1的字符串数组时strArr = list.toArray(strArr);
,则更改的引用strArray
到另一个数组。所以你不需要改变数组大小,你只需要改变数组的大小strArrays
指。也许你认为
list.toArral(strArr)
修改strArr
但事实并非如此,正如您在java文档中看到的那样。上面写着:如果列表适合指定的数组,则返回其中。否则,将使用指定数组的运行时类型和此列表的大小分配一个新数组“
对于您的案例来说,文档中的重要部分是:“否则,将分配一个新数组”,因此不会调整数组大小。
t1rydlwq2#
你可以用
巴斯卡利
List#subList(fromIndex, toIndex)
创建一个新列表,其中的元素从fromIndex
高达toIndex
(自我解释)你可以阅读更多关于https://docs.oracle.com/javase/8/docs/api/java/util/list.html#sublist-内景内景-
c9x0cxw03#
它会更改对新对象的引用。您可以通过以下方式进行检查:
System.out.println(strAttr)
在您首先分配变量之后,然后在调用strArr = list.toArray(strArr);