List
와 Array
유형 의 차이점은 무엇입니까 ?
루프, 필터 표현 등으로 동일한 작업을 수행 할 수있는 것처럼 보입니다. 동작이나 사용법에 차이가 있습니까?
val names1 = listOf("Joe","Ben","Thomas")
val names2 = arrayOf("Joe","Ben","Thomas")
for (name in names1)
println(name)
for (name in names2)
println(name)
답변
배열 및 목록 ( List<T>
및 해당 하위 유형으로 표시 MutableList<T>
)에는 많은 차이점이 있습니다. 가장 중요한 것은 다음과 같습니다.
-
Array<T>
알려진 구현이있는 클래스입니다. 항목을 저장하는 순차적 고정 크기 메모리 영역입니다 (JVM에서는 Java 배열 로 표시됩니다 ).List<T>
및MutableList<T>
: 다른 구현이 인터페이스이다ArrayList<T>
,LinkedList<T>
리스트 로직은 구체적인 구현 예에서 정의 된 메모리 등의 표현 및 조작은이 인덱싱LinkedList<T>
링크를 통해 이동하고, 반면 O (N) 시간 소요ArrayList<T>
동적으로 할당 된 어레이에서 해당 항목을 저장한다.val list1: List<Int> = LinkedList<Int>() val list2: List<Int> = ArrayList<Int>()
-
Array<T>
는 변경 가능하지만 (참조를 통해 변경할 수 있음)List<T>
수정 메소드가 없습니다 ( 읽기 전용보기MutableList<T>
또는 변경 불가능한 목록 구현 중 하나임 ).val a = arrayOf(1, 2, 3) a[0] = a[1] // OK val l = listOf(1, 2, 3) l[0] = l[1] // doesn't compile val m = mutableListOf(1, 2, 3) m[0] = m[1] // OK
-
배열의 크기는 고정되어 있으며 동일성을 유지하여 확장하거나 축소 할 수 없습니다 (크기를 조정하려면 배열을 복사해야합니다). 목록에 관해서는,
MutableList<T>
이add
과remove
가 증가하고 크기를 줄일 수 있도록 기능.val a = arrayOf(1, 2, 3) println(a.size) // will always be 3 for this array val l = mutableListOf(1, 2, 3) l.add(4) println(l.size) // 4
-
Array<T>
인 에 불변T
(Array<Int>
하지Array<Number>
)에서 동일MutableList<T>
하지만List<T>
(공변 인List<Int>
이다List<Number>
).val a: Array<Number> = Array<Int>(0) { 0 } // won't compile val l: List<Number> = listOf(1, 2, 3) // OK
-
배열은 프리미티브에 최적화되어 있습니다 :이 분리 된
IntArray
,DoubleArray
,CharArray
자바 원시적 배열에 매핑되는 등 (int[]
,double[]
,char[]
),하지 박스 사람은 (Array<Int>
자바의 매핑됩니다Integer[]
). JDK 외부의 일부 라이브러리는 기본적으로 최적화 된 목록을 제공하지만 일반적으로 목록에는 기본에 최적화 된 구현이 없습니다. -
List<T>
및MutableList<T>
되는 유형의 매핑 및 자바 상호 운용성 특별 행동 (자바는이List<T>
같은 중 코 틀린에서 볼 수List<T>
또는MutableList<T>
). 배열도 매핑되지만 다른 Java 상호 운용성 규칙 이 있습니다. -
특정 배열 유형에 사용되는 주석 (원시적 배열,
Array<String>
와,와 배열enum class
항목), 및 특별 거기 주석의 배열 리터럴 구문 . 목록 및 기타 컬렉션은 주석에 사용할 수 없습니다. -
사용법에 관해서는 코드의 성능에 중요한 부분을 제외하고 모든 곳에서 배열보다 목록을 사용하는 것이 좋습니다. 추론은 Java의 경우와 동일합니다 .
답변
사용 측면과의 주요 차이점은 배열의 크기가 고정되어 (Mutable)List
있고 크기를 동적으로 조정할 수 있다는 것입니다. 또한 Array
변경 List
이 불가능 하지만 그렇지 않습니다.
또한 kotlin.collections.List
에 의해 구현 된 인터페이스 java.util.ArrayList
입니다. 또한 kotlin.collections.MutableList
아이템 수정이 가능한 컬렉션이 필요할 때 사용되도록 확장되었습니다 .
jvm 레벨 Array
에서는 배열 로 표시됩니다 . List
반면 java.util.List
에 Java에서는 사용할 수있는 불변 콜렉션이 없기 때문에 로 표시됩니다 .