Từ Arraylist đến Array


111

Tôi muốn biết liệu chuyển đổi từ ArrayList sang Array có an toàn / có nên không? Tôi có một tệp văn bản với mỗi dòng là một chuỗi:

1236
1233
4566
4568
....

Tôi muốn đọc chúng thành danh sách mảng và sau đó tôi chuyển nó thành Mảng. Nó có được khuyến khích / hợp pháp để làm điều đó không?

cảm ơn


8
Bạn có thể , nhưng bạn đã không cung cấp cho chúng tôi gần như đủ thông tin để cho bạn biết đó là một ý tưởng tốt hay không.
Jon Skeet

6
ArrayLists's vẫn ổn. Lý do duy nhất tôi có thể thấy để chuyển đổi thành Mảng là nếu bạn cần gọi một phương thức yêu cầu nó.
mike jones

Câu trả lời:


214

Có, nó là an toàn để chuyển đổi một ArrayListthành mộtArray . Ý kiến ​​hay hay không còn tùy thuộc vào mục đích sử dụng của bạn. Bạn có cần các hoạt động ArrayListcung cấp không? Nếu vậy, hãy giữ nó an ArrayList. Chuyển đổi khác đi!

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);

đầu ra

bar.length = 5

Điều gì sẽ xảy ra nếu ArrayList trống?
ThanosFisherman

48
Sau đó, nó trống rỗng.
IMustBeSomeone

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

75

Đây là cách tốt nhất (IMHO).

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

Mã này cũng hoạt động:

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

Nhưng nó kém hiệu quả hơn: mảng chuỗi được tạo hai lần: lần đầu tiên mảng có độ dài bằng 0 được tạo, sau đó mảng kích thước thực được tạo, điền và trả về. Vì vậy, nếu bạn biết kích thước cần thiết (từ list.size()), bạn nên tạo mảng đủ lớn để đặt tất cả các phần tử. Trong trường hợp này nó không được phân bổ lại.


4
lời giải thích tốt về sự khác biệt giữa new String[0]new String[size]
gamliela

4
new String[0]thực sự hiệu quả hơn. shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef

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

Cho dù đó là một "ý tưởng hay" sẽ thực sự phụ thuộc vào trường hợp sử dụng của bạn.


cảm ơn, chỉ tò mò muốn biết: tôi không cần phải khai báo kích thước mảng?
Eddy Freeman

JavaDocs là bạn của bạn. Nếu mảng được chuyển vào quá nhỏ, một mảng mới sẽ được trả về. Các phiên bản khác của phương pháp mà mất không args trả về một mảng củaObject
Brian Roach


1

Có hai kiểu để chuyển đổi một tập hợp thành một mảng: hoặc sử dụng một mảng có kích thước trước (like c.toArray(new String[c.size()])) hoặc sử dụng một mảng trống (like c.toArray(new String[0])). Trong các phiên bản Java cũ hơn, sử dụng mảng có kích thước trước được khuyến khích, vì lệnh gọi phản chiếu cần thiết để tạo một mảng có kích thước thích hợp khá chậm. Tuy nhiên, kể từ khi cập nhật muộn của OpenJDK 6 , lệnh gọi này đã được tạo ra, làm cho hiệu suất của phiên bản mảng trống giống nhau và đôi khi thậm chí còn tốt hơn so với phiên bản có kích thước trước. Ngoài ra, việc chuyển mảng có kích thước trước cũng nguy hiểm đối với tập hợp đồng thời hoặc được đồng bộ hóa vì có thể có một cuộc chạy đua dữ liệu giữa kích thước và lệnh gọi toArray, điều này có thể dẫn đến thừa null ở cuối mảng, nếu tập hợp bị thu hẹp đồng thời trong quá trình hoạt động. Bạn có thể làm theo kiểu đồng phục:hoặc sử dụng một mảng trống (được khuyến nghị trong Java hiện đại) hoặc sử dụng một mảng có kích thước trước (có thể nhanh hơn trong các phiên bản Java cũ hơn hoặc các JVM không dựa trên HotSpot) .


1

Đây là cách sử dụng được khuyến nghị cho Java mới hơn (> Java 6)

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

Trong các phiên bản Java cũ hơn, việc sử dụng mảng có kích thước trước được khuyến khích, vì lệnh gọi phản chiếu cần thiết để tạo một mảng có kích thước thích hợp khá chậm. Tuy nhiên, kể từ khi các bản cập nhật muộn của OpenJDK 6, lệnh gọi này đã được tạo ra, làm cho hiệu suất của phiên bản mảng trống giống nhau và đôi khi còn tốt hơn, so với phiên bản có kích thước trước. Ngoài ra, việc chuyển mảng có kích thước trước cũng nguy hiểm đối với tập hợp đồng thời hoặc được đồng bộ hóa vì có thể có một cuộc chạy đua dữ liệu giữa kích thước và lệnh gọi toArray, điều này có thể dẫn đến thừa null ở cuối mảng, nếu tập hợp bị thu hẹp đồng thời trong quá trình hoạt động. Việc kiểm tra này cho phép tuân theo kiểu thống nhất: sử dụng một mảng trống (được khuyến nghị trong Java hiện đại) hoặc sử dụng một mảng có kích thước trước (có thể nhanh hơn trong các phiên bản Java cũ hơn hoặc các JVM không dựa trên HotSpot).


0

Giao diện Bộ sưu tập bao gồm phương thức toArray () để chuyển đổi một bộ sưu tập mới thành một mảng. Có hai hình thức của phương pháp này. Phiên bản không có đối số sẽ trả về các phần tử của tập hợp trong một mảng Đối tượng: public Object [] toArray (). Mảng được trả về không thể truyền sang bất kỳ kiểu dữ liệu nào khác. Đây là phiên bản đơn giản nhất. Phiên bản thứ hai yêu cầu bạn chuyển kiểu dữ liệu của mảng mà bạn muốn trả về: 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);  
           }  
      }  

để tham khảo, hãy tham khảo liên kết này http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html


0

Một cách tiếp cận sẽ là thêm Vòng lặp for thứ hai nơi việc in đang được thực hiện bên trong vòng lặp for đầu tiên. Như thế này:

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();

Nó phụ thuộc vào những gì bạn muốn đạt được nếu bạn cần thao tác mảng sau này, nó sẽ tốn nhiều công sức hơn so với việc giữ chuỗi trong ArrayList. Bạn cũng có quyền truy cập ngẫu nhiên với ArrayList củalist.get( index );

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.