list—在kotlin中,为什么mutablelistof返回java.util.arraylist的示例,而listof返回java.util.arrays$arraylist的示例?

yzckvree  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(515)

在kotlin中,mutablelistof方法返回实现kotlin的mutablelist接口的java.util.arraylist示例。
现在,listof方法返回java.util.arrays$arraylist的一个示例,该示例实现了kotlin的list接口。
据我所知,list和mutablelist只是arraylist的两个不同的“视图”,不可变和可变。当它们作为并置接口定义kotlin中arraylist的行为和用法时,为什么它们Map到看似不同的arraylist类?
java.util.arraylist和java.util.arrays$arraylist之间有什么区别?我在java文档中找不到关于后者的任何信息。此问题源于此代码在控制台中的输出:

val list = listOf(1, 2, 3)
val mutableList = mutableListOf(1, 2, 3)

println( list.javaClass )           // class java.util.Arrays$ArrayList 
println( mutableList.javaClass )    // class java.util.ArrayList
x3naxklr

x3naxklr1#

好, java.util.Arrays$ArrayList 是内部的嵌套类 Arrays 班级。两者的主要区别 java.util.Arrays$ArrayList 以及 java.util.ArrayList 前者的长度是固定的,而后者的长度可以增长。两个列表都有数组支持。 java.util.Arrays$ArrayList 也将是返回类型 Arrays.asList 用于从数组创建不可变列表。
这就是原因,为什么 MutableList 继承自 java.util.ArrayList 以及 List 另一方面继承自 java.util.Arrays$ArrayList 因为它是不变的。

9lowa7mx

9lowa7mx2#

为什么它们作为并置接口Map到看似不同的arraylist类?
接口不“Map到”类。接口指定了一组需求。如果一个类实现了一个接口,则意味着它满足该接口中指定的所有需求。 listOf 返回一个对象,该对象能够执行 List 接口。这就是函数被声明为“返回 List “同样地, mutableListOf 返回一个对象,该对象能够执行 MutableList 接口。
方法返回哪种特定类型的对象并不重要,只要它们能够执行接口中指定的操作。它们返回的具体类型,即。 listOf(...)::class 以及 mutableListOf()::class 是实施细节。因为它们是实现细节,所以你不应该把它当作“绝对真理”来说 listOf 返回一个 java.util.Arrays$ArrayList ". 事实上,没有。在撰写本文时, listOf<Integer>()::classclass kotlin.collections.EmptyList .
不管怎样, java.util.Arrays$ArrayList 是一个不可变的列表。这是一个私人的内部类 java.util.Arrays . 通常在java中可以看到这个类 Arrays.asList ,其用途与 listOf ,但这是一个实现细节。另一方面, java.util.ArrayList 是可变的。
不过 listOf 可能被设计用来返回 ArrayList (这很好),它的易变性可能隐藏在不变的背后 List 接口(哪个 ArrayList 也可以推测 Arrays$ArrayList 更可取,因为1)它不会创建传递给的数组的副本 listOf . 2) 它确实实现了 List .

相关问题