Java ma niewystarczającą możliwość szablonu. Tak długo, jak chcesz szereg obiektów, wtedy ArrayList<T>
jest dobry. Dla prymitywów to okropne.
Zakładając, że hierarchia obiektów, które chcesz umieścić na liście, ArrayList
jest idealna:
ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>();
vehicles.add(new Car(...));
vehicles.add(new Truck(...));
Jestem zakładając w powyższym przykładzie, że pojazd jest klasą bazową, a Car and Truck są podklasami.
Z drugiej strony, jeśli chcesz mieć listę liczb, Java jest wysoce nieefektywna. Każdy obiekt jest odwołaniem (tak naprawdę 4-bajtowym wskaźnikiem) do 12-bajtowego fragmentu pamięci, a także tego, czego faktycznie używasz. Ponieważ ArrayList nie może mieć zastosowania do int, oznacza to, że utworzenie listy numerów oznacza:
- Tworzenie listy Integer, wrapper obiektu dla int.
- Konwertowanie obiektów przy każdym wyciągnięciu numeru. Odbywa się to automatycznie w dzisiejszych czasach, ale wymaga czasu.
- Inicjowanie 5 razy więcej miejsca w razie potrzeby.
Tak więc, jeśli manipulujesz dużymi porcjami prymitywnych danych (int, float, double), możesz być warta napisania własnej wersji ArrayList. Jest to szczególnie ważne, gdy dane są duże, a platforma jest niewielka (jak na przykład poręczny Android).
Porównaj to:
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 1000000; i++)
list.add(i):
do:
public class IntArray {
private int[] data;
private int used;
private void grow() {
// implement code to make data double in size here...
}
public IntArray(int size) {
data = new int[size];
used = 0;
}
public void add(int i) {
if (i >= data.length) grow();
data[used++] = i;
}
}
IntArray list2 = new IntArray(1000000);
for (int i = 0; i < 1000000; i++)
list2.add(i);
Ostatni raz odwzorować go, optymalne wykorzystanie pierwotnej liście jest ponad 10 razy szybciej niż wprawdzie niewystarczające wykorzystanie ArrayList . Aby być bardziej sprawiedliwym, wstępnie przydziel listę tablicową do odpowiedniego rozmiaru - nadal jest wolniej.
Funkcja LinkedList jest warta zachodu tylko wtedy, gdy wstawiasz ją na początku lub na środku listy. Jeśli twoja lista jest budowana przez dodanie do końca, ArrayList całkowicie zdominuje LinkedList. Tak więc dla typowej listy obiektów, które budujesz w kolejności, ArrayList jest tym, czego szukasz. Dla dużej listy prymitywów, takich jak int lub double, napisz własną listę.
Trudno jest odpowiedzieć bez znajomości wymagań. Spójrz na http://download.oracle.com/javase/tutorial/collections/index.html i sprawdź, który z nich pasuje do rachunku. –
Dlaczego nie używać tych w API, na przykład ArrayList? – dacwe