Kotlin의 목록 유형과 배열 유형의 차이점


192

ListArray유형 의 차이점은 무엇입니까 ?
루프, 필터 표현 등으로 동일한 작업을 수행 할 수있는 것처럼 보입니다. 동작이나 사용법에 차이가 있습니까?

val names1 = listOf("Joe","Ben","Thomas")
val names2 = arrayOf("Joe","Ben","Thomas")

for (name in names1)
    println(name)
for (name in names2)
    println(name)

답변:


281

배열 및 목록 ( 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>addremove가 증가하고 크기를 줄일 수 있도록 기능.

    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의 경우와 동일합니다 .


26

사용 측면과의 주요 차이점은 배열의 크기가 고정되어 (Mutable)List있고 크기를 동적으로 조정할 수 있다는 것입니다. 또한 Array변경 List이 불가능 하지만 그렇지 않습니다.

또한 kotlin.collections.List에 의해 구현 된 인터페이스 java.util.ArrayList입니다. 또한 kotlin.collections.MutableList아이템 수정이 가능한 컬렉션이 필요할 때 사용되도록 확장되었습니다 .

jvm 레벨 Array에서는 배열 로 표시됩니다 . List반면 java.util.List에 Java에서는 사용할 수있는 불변 콜렉션이 없기 때문에 로 표시됩니다 .


나는 여기서 완전히 확신하지 못한다. 무엇을 변경할 수 Array있습니까? 의 요소와 동일합니다 List. 크기 List도 고정되어 있습니다.
AndroidEx

1
@AndroidEx 다음은 컴파일 val intArray = arrayOf(1,2,3); intArray[0] = 2되지 않지만 컴파일 되지는 않습니다 val intList = listOf(1,2,3); intList[0] = 2. 은 List참으로 고정 된 크기를 가지고 있지만 MutableList그것 때문에 그것은이 가능성이없는 확장하는 val a:List<Int>다른보고 size후속 호출합니다.
miensol

List또는 사용하는 것이 좋습니다 ArrayList?
IgorGanapolsky

2
@IgorGanapolsky 구체적인 구현 사용에 신경 쓰지 않는다면 List(어쩌면 99 %의 경우). 구현 사용 ArrayList또는 LinkedList다른 구체적인 구현에 관심이있는 경우
miensol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.