.NET 데이터 구조 :
ArrayList와 List가 실제로 다른 이유에 대한 대화
배열
한 사용자가 말했듯이 배열은 "구식"컬렉션입니다 (예, 배열은의 일부는 아니지만 컬렉션으로 간주 됨 System.Collections
). 그러나 다른 컬렉션, 즉 제목에 나열한 컬렉션 (여기서는 ArrayList 및 List (Of T))과 비교하여 배열에 대해 "오래된 학교"란 무엇입니까? 배열을보고 기본 사항부터 시작하겠습니다.
우선 Microsoft .NET의 어레이 는 "논리적으로 관련된 여러 항목을 단일 컬렉션으로 취급 할 수있는 메커니즘"입니다 (링크 된 기사 참조). 그게 무슨 뜻이야? 배열은 개별 주소 (요소)를 순차적으로 메모리에 시작 주소가있는 순서대로 저장합니다. 배열을 사용하면 해당 주소에서 시작하여 순차적으로 저장된 요소에 쉽게 액세스 할 수 있습니다.
그 외에도 101 개의 공통 개념을 프로그래밍하는 것과 달리 배열은 실제로 매우 복잡 할 수 있습니다.
배열은 단일 차원, 다차원 또는 들쭉날쭉 한 것일 수 있습니다 (들쭉날쭉 한 배열은 읽을 가치가 있습니다). 배열 자체가 동적 아니다 : 초기화되면, 어레이 N의 크기를 보유하기 위해서 충분한 공간 N 객체들의 수. 배열의 요소 수는 늘어나거나 줄어들 수 없습니다. Dim _array As Int32() = New Int32(100)
배열이 100 개의 Int32 기본 유형 객체를 포함 할 수 있도록 메모리 블록에 충분한 공간을 예약합니다 (이 경우 배열은 0을 포함하도록 초기화 됨). 이 블록의 주소는로 반환됩니다 _array
.
이 기사에 따르면 CLS ( 공용 언어 사양 )에서는 모든 배열이 0부터 시작해야합니다. .NET의 배열은 0이 아닌 배열을 지원합니다. 그러나 이것은 덜 일반적입니다. 제로 기반 어레이의 "공통성"의 결과로 Microsoft는 성능을 최적화하는 데 많은 시간을 보냈습니다 . 따라서 단일 차원의 0부터 시작하는 (SZ) 배열은 "특별한"배열이며 실제로는 다차원과 달리 배열의 최상의 구현입니다. SZ에는 배열을 조작하기위한 특정 중개 언어 명령어가 있기 때문입니다.
배열은 항상 참조에 의해 전달됩니다 (메모리 주소로)-중요한 배열 퍼즐 조각입니다. 경계 검사를 수행하는 동안 (오류가 발생 함) 배열에서 경계 검사를 비활성화 할 수도 있습니다.
다시 말하지만 배열에 대한 가장 큰 장애는 크기를 조정할 수 없다는 것입니다. 그것들은 "고정 된"용량을 가지고 있습니다. 히스토리에 ArrayList 및 List (Of T) 소개 :
ArrayList-일반이 아닌 목록
ArrayList를은 (함께 List(Of T)
- 몇 가지 중요한 차이가 있지만, 여기에, 나중에 설명) - 아마도 (넓은 의미에서) 컬렉션의 다음뿐만 아니라 최고의 생각이다. ArrayList는 IList ( 'ICollection'의 자손) 인터페이스 에서 상속합니다 . ArrayLists는 자체이다 부피가 더 필요 - 오버 헤드 - 목록보다.
IList
구현시 ArrayList를 고정 크기 목록 (예 : Arrays)으로 처리 할 수 있습니다. 그러나 ArrayLists에 의해 추가 된 추가 기능 외에,이 경우 ArrayLists (Array보다) 크기가 고정되어있는 ArrayLists를 사용하면 실질적으로 이점이 없습니다.
내 독서에서 ArrayLists는 들쭉날쭉해질 수 없습니다. "다차원 배열을 요소로 사용하는 것은 지원되지 않습니다". 다시, ArrayLists의 관에 또 다른 손톱. ArrayLists는 또한 "유형"이 아닙니다. 즉, 모든 것 아래에서 ArrayList는 단순히 객체의 동적 배열입니다 Object[]
. 이것은 ArrayLists를 구현할 때 많은 복싱 (암시 적) 및 언 박싱 (명시 적)이 필요하며 다시 오버 헤드에 추가됩니다.
불확실한 생각 : 나는 ArrayLists가 Arrays에서 List-type Collections로 이동하려는 시도에 대한 나쁜 자식 개념의 자식이라는 것을 교수들 중 한 사람으로부터 읽거나 들었다는 것을 기억합니다. 컬렉션과 관련하여 추가 개발이 완료되었으므로 더 이상 최선의 선택이 아닙니다.
List (Of T) : ArrayList가 된 (및 희망)
메모리 사용량의 차이는 (INT32의) 목록이 56 %를 소비 덜 같은 기본 유형을 포함하는 ArrayList에 비해 메모리 곳으로 크게 충분하다 (8메가바이트 위의 신사의 연결 시연에서 19메가바이트 대 : 다시 연결 여기에 ) - 비록 이는 64 비트 시스템에 의해 복합 된 결과입니다. 이 차이점은 실제로 두 가지를 보여줍니다. 첫 번째 (1), 박스형 Int32 유형 "object"(ArrayList)는 순수한 Int32 기본 유형 (List)보다 훨씬 큽니다. 둘째, 64 비트 시스템의 내부 작업으로 인해 차이가 기하 급수적으로 증가합니다.
차이점은 무엇이며 List (Of T)는 무엇입니까? MSDN 은 List(Of T)
"... 인덱스로 액세스 할 수있는 강력한 형식의 개체 목록"으로 정의합니다 . 여기서 "강력한 형식의"비트가 중요합니다. List (Of T)는 형식을 '인식'하고 개체를 해당 형식으로 저장합니다. 따라서 는 형식이 아닌 형식 Int32
으로 저장됩니다 . 이것은 권투와 박스 해제로 인한 문제를 제거합니다.Int32
Object
MSDN은이 차이가 기본 형식을 저장하고 참조 형식을 저장할 때만 발생한다고 지정합니다. 너무 큰 차이는 500 개 이상의 요소에서 실제로 발생합니다. 더 흥미로운 점은 MSDN 설명서에 "ArrayList 클래스를 사용하는 대신 List (Of T) 클래스의 형식 별 구현을 사용하는 것이 유리하다는 것입니다."
본질적으로 List (Of T)는 ArrayList이지만 더 좋습니다. ArrayList의 "일반적인"항목입니다. ArrayList와 마찬가지로 정렬 될 때까지 정렬되지 않을 수도 있습니다 (그림 참조). List (Of T)에도 일부 기능이 추가되었습니다.