2012-03-26 17 views
10

Zastanawiam się, dlaczego zaprojektowali metodę toArray w ArrayList, aby pobrać dane wejściowe tablicy w języku Java?Metoda ArrayList.toArray() w języku Java

ArrayList<String> listArray = new ArrayList<String>(); 

    listArray.add("Germany"); 
    listArray.add("Holland"); 
    listArray.add("Sweden"); 

    String []strArray = new String[3]; 
    String[] a = (String [])listArray.toArray(strArray); 

Dla mnie wydaje się, że oni nie potrzebują tego wejścia, ponieważ wystąpienie samego ArrayList ma wystarczającą ilość informacji, aby przekształcić dane w tablicy.

Moje pytanie brzmi: dlaczego nadal potrzebują tablicy do przekazania? Dzięki.

Odpowiedz

13

z dwóch powodów mogę myśleć:

  1. Erasure oznacza, że ​​parametry generyczne nie są dostępne w czasie wykonywania, więc ArrayList<String> nie wie że zawiera ciągi, to po prostu typ surowej ArrayList. Zatem wszystkie wywołania z toArray() będą musiały zwrócić wartość Object[], co nie jest ściśle poprawne. Trzeba by stworzyć drugą tablicę z String[], a następnie iterować nad pierwszą, rzucając wszystkie jej parametry, aby wyjść z pożądanym typem wyniku.
  2. Sposób zdefiniowania metody oznacza, że ​​można przekazać odniesienie do istniejącej macierzy i wypełnić tą metodą. W niektórych przypadkach jest to bardzo wygodne, zamiast zwracania nowej tablicy, a następnie kopiowania jej wartości w innym miejscu.
+0

Dzięki, zrozumiałem. W moim przykładzie, czy powinienem przyjąć jako wynik końcowy "strArray" lub "a"? Czy są one takie same? –

+4

Są takie same, _if_ 'collection.size() <= strArray.size()', co jest prawdziwe w konkretnym przypadku. Zasadniczo najlepiej jest używać 'a'. –

+0

@LouisWasserman Dzięki. –

0

Jest tak, że gdy masz niepustą tablicę, do której chcesz dodać obiekt do tablicy z konwersji listy tablic, możesz to zrobić bez konieczności tworzenia nowej tablicy, i postprocesowania scalania go, zapisywania zasobu i dodatkowa praca.

odczytać drugi akapit Javadoc http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray: T ([])

1

Potrzebujesz go, aby uzyskać typy tablic inne niż Object[]. listArray.toArray(new String[3]) nie powinien w rzeczywistości wymagać rzutowania na String[], ale umożliwia zapisywanie w tablicach dla określonych typów, a nie (raczej niebezpieczne) podejście polegające na odlewaniu Object[] do dowolnego typu.

0

Nie jest to obowiązkowe, aby przekazać tablicę jako argument do ToArray() można wywołać bezpośrednio arrayList.toArray()

Ponieważ wiemy, że Collection ramy z rodzajowych współpracuje z koncepcją Rodzaj Erasure. Tak więc lista tablic staje się listą obiektów, więc po przekonwertowaniu do tablicy da ona obiekt Object [], jeśli nie przekażesz żadnego argumentu.

0

ArrayList nie ma wystarczających informacji, biorąc pod uwagę, że same "dane" są przechowywane w segmentach tablic Object. Tak więc, jeśli wiesz, jakie elementy masz na liście tablic, możesz osiągnąć bezpieczeństwo typu przy użyciu tego wariantu metody toArray.

2

W swoim kodzie ArrayList może zawierać niczego nie tylko ciągi. Można przepisać kod do:

ArrayList<String> listArray = new ArrayList<String>(); 

listArray.add("Germany"); 
listArray.add("Holland"); 
listArray.add("Sweden"); 

String []strArray = new String[3]; 
String[] a = listArray.toArray(strArray); 

Jednak w tablice Java zawierać ich typ zawartości (String) w czasie wykonywania, podczas gdy leki generyczne są usuwane przez kompilator, więc nadal nie ma sposobu na system Runtime wiedzieć, że powinien utworzyć kod String[].