在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
2条答案
按热度按时间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
因为它是不变的。9lowa7mx2#
为什么它们作为并置接口Map到看似不同的arraylist类?
接口不“Map到”类。接口指定了一组需求。如果一个类实现了一个接口,则意味着它满足该接口中指定的所有需求。
listOf
返回一个对象,该对象能够执行List
接口。这就是函数被声明为“返回List
“同样地,mutableListOf
返回一个对象,该对象能够执行MutableList
接口。方法返回哪种特定类型的对象并不重要,只要它们能够执行接口中指定的操作。它们返回的具体类型,即。
listOf(...)::class
以及mutableListOf()::class
是实施细节。因为它们是实现细节,所以你不应该把它当作“绝对真理”来说listOf
返回一个java.util.Arrays$ArrayList
". 事实上,没有。在撰写本文时,listOf<Integer>()::class
是class 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
.