어떤 경우에는 Array (Buffer) 및 List (Buffer)를 사용해야합니다. 내가 아는 한 가지 차이점은 배열이 변하지 않고 목록이 공변량이라는 것입니다. 그러나 성능과 다른 특성은 어떻습니까?
답변
불변의 구조
스칼라는 List
당신이 (아마도)이보다 훨씬 더 그것을 사용되어야한다고 스칼라에서 이러한 기본 구조이다 불변의 재귀 데이터 구조입니다 Array
(실제로있는 가변 – 불변 아날로그 의 Array
것입니다 IndexedSeq
).
Java 배경에서 오는 경우 LinkedList
over 를 사용 하는 것이 분명 ArrayList
합니다. 전자는 일반적으로 순회 만 (및 크기가 사전에 알려지지 않은) 목록에 사용되는 반면 후자는 알려진 크기 (또는 최대 크기)가 있거나 빠른 임의 액세스 가 중요한 목록에 사용됩니다.
가변 구조
ListBuffer
이후 변환이 필요한 경우 List
에만 사용 ListBuffer
하는 이유 인 상수 시간 변환을 제공 합니다.
스칼라 Array
는 Java 배열에 의해 JVM에서 구현되어야하므로 새로운 기능 을 가진 최신 버전의 스칼라를 사용하지 않는 한 내용 보다 상자의 Array[Int]
성능이 훨씬 뛰어 납니다. .int[]
List[Int]
@specialized
그러나 Array
스칼라에서 s 의 사용은 최소한으로 유지되어야 한다고 생각합니다. 왜냐하면 배열에서 실제로 필요한 기본 유형에 의해 지원되는지 여부를 결정하기 위해 후드에서 무슨 일이 일어나고 있는지 알아야한다는 느낌이 들기 때문입니다. 랩퍼 유형으로 상자에 넣습니다.
답변
이미 게시 된 답변 외에도 몇 가지 세부 사항이 있습니다.
가 있지만 Array[A]
Java 배열 그대로이고, A는 List[A]
하나이며 불변의 데이터 구조 Nil
(빈리스트) 또는 한 쌍의 구성은 (A, List[A])
.
성능 차이
Array List
Access the ith element θ(1) θ(i)
Delete the ith element θ(n) θ(i)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Count the elements θ(1) θ(n)
메모리 차이
Array List
Get the first i elements θ(i) θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
따라서 빠른 임의 액세스가 필요하지 않거나 요소를 계산해야하거나 어떤 이유로 든 파괴적인 업데이트가 필요한 경우 List
가 아니라 a 보다 낫습니다 Array
.
답변
배열은 변경 가능합니다. 즉, 각 인덱스의 값을 변경할 수 있고 목록 (기본적으로)은 변경할 수 없습니다. 즉, 수정할 때마다 새 목록이 작성됩니다. 대부분의 경우 그것은 불변의 데이터 유형과 일에 대한보다 “기능”스타일이며, 당신은 아마 시도와 같은 구조를 가진 목록을 사용한다 yield
, foreach
, match
등.
성능 특성의 경우 요소에 무작위로 액세스하면 배열이 빨라지고 새로운 요소를 추가 (추가)하면 목록이 빨라집니다. 그것들을 반복하는 것은 비슷합니다.