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에서는 사용할 수있는 불변 콜렉션이 없기 때문에 로 표시됩니다 .
