Arraylist에서 Array로


111

ArrayList에서 Array로 변환하는 것이 안전 / 권장되는지 알고 싶습니다. 각 줄에 문자열이있는 텍스트 파일이 있습니다.

1236
1233
4566
4568
....

배열 목록으로 읽어 들인 다음 배열로 변환합니다. 그렇게하는 것이 합법적입니까?

감사


8
하실 는 있지만 좋은 아이디어인지 아닌지를 알려주기에 충분한 정보를 제공하지 않았습니다.
Jon Skeet

6
ArrayLists는 괜찮습니다. 내가 배열로 변환 할 수있는 유일한 이유는 필요한 메서드를 호출해야하는 경우입니다.
mike jones

답변:


214

, ArrayListArray . 좋은 아이디어인지 여부는 의도 된 용도에 따라 다릅니다. ArrayList제공 하는 작업이 필요 합니까? 그렇다면 ArrayList. 그렇지 않으면 멀리 개종하십시오!

ArrayList<Integer> foo = new ArrayList<Integer>();
foo.add(1);
foo.add(1);
foo.add(2);
foo.add(3);
foo.add(5);
Integer[] bar = foo.toArray(new Integer[foo.size()]);
System.out.println("bar.length = " + bar.length);

출력

bar.length = 5

ArrayList가 비어 있으면 어떻게됩니까?
ThanosFisherman

48
그러면 비어 있습니다.
IMustBeSomeone

1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
Aaron Franke 2018

75

이것이 최선의 방법 (IMHO)입니다.

List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);

이 코드는 다음과 같이 작동합니다.

String[] myArray = myArrayList.toArray(new String[0]);

그러나 덜 효과적입니다. 문자열 배열이 두 번 생성됩니다. 처음에 길이가 0 인 배열이 생성 된 다음 실제 크기 배열이 생성되고 채워지고 반환됩니다. 따라서 필요한 크기 (부터 list.size()) 를 알고 있기 때문에 모든 요소를 ​​넣을 수있을만큼 큰 배열을 만들어야합니다. 이 경우 재 할당되지 않습니다.


4
차이의 좋은 설명 new String[0]new String[size]
gamliela

4
new String[0]실제로 더 효율적입니다. shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef

5
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

"좋은 아이디어"인지 여부는 실제로 사용 사례에 따라 달라집니다.


감사합니다. 궁금한 점이 있습니다. 배열 크기를 선언 할 필요가 없습니까?
Eddy Freeman 2011

JavaDocs는 당신의 친구입니다. 전달되는 배열이 너무 작 으면 새 배열이 반환됩니다. 인수가없는 메서드의 다른 버전은 배열을 반환합니다.Object
Brian Roach


1

컬렉션을 배열로 변환하는 두 가지 스타일이 있습니다. 미리 크기가 c.toArray(new String[c.size()])지정된 배열 (예 :) 또는 빈 배열 (예 :)을 사용합니다 c.toArray(new String[0]). 사전 크기 배열을 사용하는 이전 Java 버전에서는 적절한 크기의 배열을 만드는 데 필요한 리플렉션 호출이 매우 느리기 때문에 권장되었습니다. 그러나 빈 배열 (최신 Java에서 권장 됨)을 사용하거나 사전 크기 배열 (이전 Java 버전 또는 HotSpot 기반이 아닌 JVM에서 더 빠를 수 있음)을 사용하는 최신 업데이트 이후 . OpenJDK 6의 호출이 내재되어 빈 어레이 버전의 성능이 미리 크기 조정 된 버전과 비교하여 동일하고 때로는 더 나아졌습니다. 또한 사전 크기 배열을 전달하는 것은 크기와 toArray 호출 사이에 데이터 경합이 가능하기 때문에 동시 또는 동기화 된 수집에 위험합니다.이 경우 수집이 작업 중에 동시에 축소 된 경우 배열 끝에 추가 null이 발생할 수 있습니다. 유니폼 스타일을 따를 수 있습니다.


1

최신 Java (> Java 6)에 권장되는 사용법입니다.

String[] myArray = myArrayList.toArray(new String[0]);

사전 크기 배열을 사용하는 이전 Java 버전에서는 적절한 크기의 배열을 만드는 데 필요한 리플렉션 호출이 매우 느리기 때문에 권장되었습니다. 그러나 OpenJDK 6의 최신 업데이트 이후이 호출이 내재되어 빈 어레이 버전의 성능이 미리 크기 조정 된 버전과 비교하여 동일하고 때로는 더 나아졌습니다. 또한 사전 크기 배열을 전달하는 것은 크기와 toArray 호출 사이에 데이터 경합이 가능하기 때문에 동시 또는 동기화 된 수집에 위험합니다.이 경우 수집이 작업 중에 동시에 축소 된 경우 배열 끝에 추가 null이 발생할 수 있습니다. 이 검사를 통해 빈 배열 (최신 Java에서 권장 됨)을 사용하거나 사전 크기 배열 (이전 Java 버전 또는 HotSpot 기반이 아닌 JVM에서 더 빠를 수 있음)을 사용하여 균일 한 스타일을 따를 수 있습니다.


0

Collection 인터페이스에는 새 컬렉션을 배열로 변환하는 toArray () 메서드가 포함되어 있습니다. 이 방법에는 두 가지 형태가 있습니다. 인수가없는 버전은 컬렉션의 요소를 Object 배열로 반환합니다. public Object [] toArray (). 반환 된 배열은 다른 데이터 유형으로 캐스트 할 수 없습니다. 이것은 가장 간단한 버전입니다. 두 번째 버전에서는 반환하려는 배열의 데이터 유형을 전달해야합니다. public Object [] toArray (Object type []).

 public static void main(String[] args) {  
           List<String> l=new ArrayList<String>();  
           l.add("A");  
           l.add("B");  
           l.add("C");  
           Object arr[]=l.toArray();  
           for(Object a:arr)  
           {  
                String str=(String)a;  
                System.out.println(str);  
           }  
      }  

참고로 http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html 링크를 참조하십시오.


0

한 가지 방법은 첫 번째 for 루프 내에서 인쇄가 수행되는 두 번째 for 루프를 추가하는 것입니다. 이렇게 :

static String[] SENTENCE; 

public static void main(String []args) throws Exception{

   Scanner sentence = new Scanner(new File("assets/blah.txt"));
   ArrayList<String> sentenceList = new ArrayList<String>();

   while (sentence.hasNextLine())
   {
       sentenceList.add(sentence.nextLine());
   }

   sentence.close();

   String[] sentenceArray = sentenceList.toArray(new String[sentenceList.size()]);
  // System.out.println(sentenceArray.length);
   for (int r=0;r<sentenceArray.length;r++)
   {
       SENTENCE = sentenceArray[r].split("(?<=[.!?])\\s*"); //split sentences and store in array 

       for (int i=0;i<SENTENCE.length;i++)
       {
           System.out.println("Sentence " + (i+1) + ": " + SENTENCE[i]);
       }
   }    

}

0
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();

나중에 배열을 조작해야하는 경우 달성하려는 목표에 따라 ArrayList에 문자열을 유지하는 것보다 더 많은 노력이 소요됩니다. 또한 ArrayList에 대한 임의 액세스 권한이 있습니다.list.get( index );

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.