C # ArrayList
과 의 차이점은 무엇입니까 List<>
?
그렇지 않은 List<>
유형 만 ArrayList
있습니까?
답변
그렇습니다. List<T>
일반 클래스입니다. 캐스팅하거나 캐스팅하지 않고 특정 유형의 값을 저장할 수 있습니다 object
( T
이 경우 값 유형 인 경우 boxing / unboxing 오버 헤드가 발생 함 ArrayList
). ArrayList
단순히 object
참조 를 저장 합니다. 일반 컬렉션으로서 List<T>
일반 IEnumerable<T>
인터페이스를 구현하며 LINQ에서 쉽게 사용할 수 있습니다 ( Cast
또는 OfType
호출 하지 않아도 됨 ).
ArrayList
C #에 제네릭이 없었던 날에 속합니다. 에 찬성하여 더 이상 사용되지 않습니다 List<T>
. 당신은 사용하지 말아야 ArrayList
새로운 코드에 그 목표 .NET> = 2.0 오래된 API와 인터페이스해야하지 않는 한 그것은 그.
답변
사용 List<T>
당신은 오류를 캐스팅 방지 할 수 있습니다. 런타임 캐스팅 오류 를 피하는 것이 매우 유용합니다 .
예:
여기서 (를 사용하여 ArrayList
)이 코드를 컴파일 할 수 있지만 나중에 실행 오류가 표시됩니다.
ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //No error at compile process
int total = 0;
foreach (int num in array1)
{
total += num; //-->Runtime Error
}
를 사용 List
하면 다음 오류를 피할 수 있습니다.
List<int> list1 = new List<int>();
list1.Add(1);
//list1.Add("Pony"); //<-- Error at compile process
int total = 0;
foreach (int num in list1 )
{
total += num;
}
참조 :
MSDN
답변
위의 포인트에 추가합니다. 사용하여 ArrayList
64 비트 운영 시스템은 32 비트 운영체제에서 사용하는 것보다 2 배의 메모리 걸린다. 한편, 일반 목록 List<T>
은보다 적은 메모리를 사용합니다 ArrayList
.
예를 들어 ArrayList
32 비트에서 19MB를 사용하는 경우 64 비트에서 39MB가 필요합니다. 그러나 List<int>
32 비트 의 일반 8MB 목록이있는 경우 64 비트의 경우 8.1MB 만 사용되므로 ArrayList와 비교할 때 481 %의 차이가 있습니다.
답변
추가해야 할 또 다른 차이점은 스레드 동기화와 관련이 있습니다.
ArrayList
컬렉션 주위의 스레드 안전 래퍼를 반환하는 Synchronized 속성을 통해 스레드 안전을 제공합니다. 랩퍼는 모든 추가 또는 제거 조작에서 전체 콜렉션을 잠그면 작동합니다. 따라서 컬렉션에 액세스하려는 각 스레드는 해당 차례가 하나의 잠금을 수행 할 때까지 기다려야합니다. 이는 확장 할 수 없으며 대규모 컬렉션의 경우 성능이 크게 저하 될 수 있습니다.
List<T>
스레드 동기화를 제공하지 않습니다. 사용자 코드는 여러 스레드에서 동시에 항목을 추가하거나 제거 할 때 모든 동기화를 제공해야합니다.
자세한 내용 은 .Net Framework의 스레드 동기화
답변
간단한 대답은
ArrayList는 제네릭이 아닙니다
- 객체 유형이므로 모든 데이터 유형을 저장할 수 있습니다.
- String, int, employee 및 object와 같은 값 (값 유형 또는 참조 유형)을 ArrayList에 저장할 수 있습니다. (참고 및)
- 권투와 Unboxing이 일어날 것입니다.
- 안전하지 않습니다.
- 오래되었습니다.
일반 목록
- 유형 유형이므로 런타임시 T를 지정할 수 있습니다.
- 선언에 따라 유형 T (문자열 또는 정수 또는 직원 또는 객체)의 유일한 값을 저장할 수 있습니다. (참고 또는)
- 권투와 Unboxing이 발생하지 않습니다.
- 안전한 타입.
- 최신입니다.
예:
ArrayList arrayList = new ArrayList();
List<int> list = new List<int>();
arrayList.Add(1);
arrayList.Add("String");
arrayList.Add(new object());
list.Add(1);
list.Add("String"); // Compile-time Error
list.Add(new object()); // Compile-time Error
Microsoft 공식 문서를 읽으십시오 : https://blogs.msdn.microsoft.com/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system-collections-objectmodel/
참고 : 차이점을 이해하기 전에 Generics를 알아야합니다. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/
답변
ArrayList
서로 다른 유형의 데이터를 List<>
수집 하는 반면 유사한 유형의 자체 depedencties를 수집합니다.
답변
ArrayList
형식이 안전하지만 형식이 안전하지 않습니다 List<T>
. 단순 :).