C #에서 ArrayList와 List <> 차이점은 무엇입니까 List<>? 그렇지 않은

C # ArrayList과 의 차이점은 무엇입니까 List<>?

그렇지 않은 List<>유형 만 ArrayList있습니까?



답변

그렇습니다. List<T>일반 클래스입니다. 캐스팅하거나 캐스팅하지 않고 특정 유형의 값을 저장할 수 있습니다 object( T이 경우 값 유형 인 경우 boxing / unboxing 오버 헤드가 발생 함 ArrayList). ArrayList단순히 object참조 를 저장 합니다. 일반 컬렉션으로서 List<T>일반 IEnumerable<T>인터페이스를 구현하며 LINQ에서 쉽게 사용할 수 있습니다 ( Cast또는 OfType호출 하지 않아도 됨 ).

ArrayListC #에 제네릭이 없었던 날에 속합니다. 에 찬성하여 더 이상 사용되지 않습니다 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


답변

위의 포인트에 추가합니다. 사용하여 ArrayList64 비트 운영 시스템은 32 비트 운영체제에서 사용하는 것보다 2 배의 메모리 걸린다. 한편, 일반 목록 List<T>은보다 적은 메모리를 사용합니다 ArrayList.

예를 들어 ArrayList32 비트에서 19MB를 사용하는 경우 64 비트에서 39MB가 필요합니다. 그러나 List<int>32 비트 의 일반 8MB 목록이있는 경우 64 비트의 경우 8.1MB 만 사용되므로 ArrayList와 비교할 때 481 %의 차이가 있습니다.

출처 : 기본 유형 및 64 비트에 대한 ArrayList와 일반 목록


답변

추가해야 할 또 다른 차이점은 스레드 동기화와 관련이 있습니다.

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>. 단순 :).