문제

나는 종종 an을 사용합니다 ArrayList '정상'대신 array[].

나는 내가 ArrayList, 언제 괜찮습니까? ArrayList 배열에?

도움이 되었습니까?

해결책

배열은 강력하게 입력되며 매개 변수로 잘 작동합니다. 컬렉션의 길이를 알고 고정 된 경우 배열을 사용해야합니다.

배열 목록은 강력하게 입력되지 않으며, 모든 삽입 또는 재심은 원래 유형으로 돌아가려면 캐스트가 필요합니다. 특정 유형의 목록을 가져 오는 메소드가 필요한 경우 배열리스트는 모든 유형이 포함 된 ArrayList를 전달할 수 있으므로 부족합니다. ArrayList는 내부적으로 동적으로 확장되는 배열을 사용하므로 용량에 맞을 때 내부 배열의 크기를 확장하기 위해 히트가 있습니다.

당신이 정말로 사용하고 싶은 것은 일반적인 목록입니다. List<T>. 여기에는 배열 및 배열리스트의 모든 장점이 있습니다. 강력하게 입력되며 가변 길이의 항목을 지원합니다.

다른 팁

Bob 's와 Frederick의 반응 외에도 배열에는 공분산이 있지만 일반 목록은 그렇지 않다는 점을 지적하고 싶습니다. 예를 들어, 유형 배열입니다 MyChildClass[] 쉽게 캐스트 될 수 있습니다 MyParentClass[], 동안 List<MyChildClass> 캐스팅 할 수 없습니다 List<MyParentClass>, 적어도 직접적이지 않습니다.

공분산이 필요한 경우 배열을 사용하거나 Linq 's Cast () 메소드를 사용하거나 각 항목을 개별적으로 캐스팅하는 다른 수단을 사용하십시오. 또는 C# 4를 기다립니다.

여기서 또 다른 생각은 돌연변이입니다. 배열 (T[])는 완전히 변이 가능하며 보호 할 수 없습니다. List<T> 유용한 확장 지점을 제공하지 않지만 Collection<T> (또는 다른 많은 IList<T> 구현) 코드를 추가하기 전에 항목이 추가되기 전에 코드를 추가 할 수 있습니다. 마찬가지로, 당신은 준비 적으로 가질 수 있습니다 IList<T> 불변성이 바람직한 스레드 안전에 유용한 구현.

나는 내부 메소드 논리 (아마도 로컬 변수)에서 배열을 사용하는 경향이 있습니다. params 인수 또는 항목의 길이를 알고있는 고도로 최적화 된 몇 가지 경우, 코드를 알고 있습니다. 선택합니다 (개인 분야로서) 돌연변이하지 마십시오. 그 이외의, List<T> 등은 품목을 추가/제거 할 때 오버 헤드가 훨씬 적기 때문에 더 흔한 경향이 있습니다.

코드의 해당 부분이 절대적으로 성능이 중요하지 않으면 ArrayList를 사용하는 것은 완벽합니다.

더 나은 곳, 당신이 어디에 있든 ArrayList, 사용 List<T> 대신 일반 컬렉션. 전자보다 더 강력하게 입력됩니다.

나는 Java 관점에서 이것에 대답하고 있지만 동일한 기본 문제입니다. 높은 추상화를 사용하여 죄책감을 느끼지 않아야합니다. 결국, 당신은 사용하고 있습니다 String대신 char[], 또는 byte[]? 한 걸음 더 나아가서 List 가능한 경우 인터페이스. 한 걸음 물러나야하는 유일한 이유는 성능의 이유 때문입니다.

더 높은 수집 추상화를 사용하면 많은 장점이 있습니다. 데코레이터를 추가하여 목록을 읽고, 고정 크기로 만들고, 입력하거나 컬렉션을 입력하거나 뷰를 사용하는 항목을 확인하십시오 ( GetRange C# 및 subList 자바에서.)

그건 그렇고, an ArrayList 항상 원시 배열을 기반으로해야합니다. 그렇지 않으면 이름이 잘못되었습니다. 작업은 일반적으로 기본 배열을 사용할 때 예상되는 방식으로 구현됩니다. 링크 된 목록이 사용되면 일반적으로 그 이름은 그 이름입니다. LinkedList. 그것은 또한 인터페이스를 사용하는 것의 이점입니다. 나중에 중고 구현에 대해 마음을 바꿀 수 있습니다.

컬렉션을 사용하는 몇 가지가 있습니다. 한 가지주의 사항은 컬렉션이 일반적으로 객체를 기반으로하고 언어는 원시 유형과 객체 유형 사이에 상당한 간격이 있다는 것입니다. 제한된 제네릭도 많은 도움이되지 않습니다. 그럼에도 불구하고 다른 이유가 없다면 배열을 통해 컬렉션을 권장합니다.

기본 값의 경우 원시 수집 라이브러리를 사용하는 것을 고려할 수도 있습니다. gnu trove. 그래도 C#과 비슷한 것이 있는지 모르겠습니다.

코딩의 멋진 모험 조각을 썼습니다 어레이는 다소 유해하다고 생각합니다. 정말 흥미로운 독서입니다.

하나의 경우, 특정 유형을 처리하려는 경우 Arraylist를 사용해서는 안됩니다. 예를 들어, 바이트 배열 만 기대하는 경우 바이트 배열 만 허용해야합니다.

배열 목록을 사용한다고 생각할 수도 있다고 생각하는 시간은 목록 대신입니다.

배열의 크기는 정적이므로 설계 시간에 크기를 알고 있다면 배열을 사용하십시오. 더 빨리 작동해야하지만 직접 테스트하지 않았습니다. 객체 수를 자주 변경 해야하는 경우 (컬렉션에서 객체 추가 또는 제거) ArrayList를 사용하거나 .NET 2의 일반 목록을 사용하거나 사용하기 쉽기 때문에 성능이 중요하지 않은 경우 항상 목록을 사용할 수 있습니다.

원시 유형 배열이 필요한 경우자가 옥스화 및 개봉을 피할 수 있으므로 더 나은 성능을 위해 배열을 사용하십시오. 그러나 미리 원하는 크기를 알고있는 경우에만.

이건 같아요.

using System;
using System.Collections;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //ArrayList
            /*
             An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects      
             */
            ArrayList list = new ArrayList();
            list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
            list.Add(1);
            list.Add(1.25);

            //Array
            /*
             must declare length.
             */
            string[] array = new string[3]; // you must declare object types
            array[0] = "1";
            //array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
            array[2] = "stongly typed";
            Console.WriteLine("------- ARRAYLIST ITEMS ---------");
            foreach (var i in list) {
                Console.WriteLine(i);
            }

            Console.WriteLine("--------- ARRAY ITEMS -----------");
            foreach (var i in array)
            {
                Console.WriteLine(i);
            }

            Console.ReadKey(); 
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top