Tablice o zmiennej długości (dynamiczne) w Javie

108

Zastanawiałem się, jak zainicjować tablicę liczb całkowitych, tak aby jej rozmiar i wartości zmieniały się w trakcie wykonywania mojego programu, jakieś sugestie?

Mohammad Sepahvand
źródło

Odpowiedzi:

121

Tak: użyj ArrayList .

W Javie „normalne” tablice mają stałą wielkość. Musisz nadać im rozmiar i nie możesz ich rozszerzać ani zmniejszać. Aby zmienić rozmiar, musisz utworzyć nową tablicę i skopiować żądane dane - co jest nieefektywne i uciążliwe.

Na szczęście istnieje wiele rodzajów wbudowanych klas, które implementują typowe struktury danych, a także inne przydatne narzędzia. Będziesz chciał sprawdzić API Java 6, aby uzyskać pełną ich listę.

Jedno zastrzeżenie: ArrayList może przechowywać tylko obiekty (np. Liczby całkowite), a nie prymitywy (np. Int). W WIĘKSZOŚCI przypadków autoboxing / autounboxing zajmie się tym po cichu, ale możesz uzyskać dziwne zachowanie w zależności od tego, co robisz.

Wyskakuje
źródło
2
Zastanawiam się, dlaczego poniższy kod jest w Javie? int[] array = new int[size]; sizejest zmienną, ale długość tablicy musi być ustalona, ​​mam rację? @Lord Torgamus
jerry_sjtu
12
@jerry_sjtu tak, tablica nie zmienia rozmiaru w celu dopasowania sizew trakcie działania programu; dostaje taki rozmiar, jaki jest, sizekiedy ta linia jest wykonywana.
Wyskakuje
Za każdym razem, gdy usuwam element z ArrayList, na końcu kończę null. Jakieś pomysły, dlaczego?
Aaron Franke,
37

Tablice w Javie mają stały rozmiar. Potrzebujesz tablicy ArrayList, jednej z wielu niezwykle cennych kolekcji dostępnych w Javie.

Zamiast

Integer[] ints = new Integer[x]

używasz

List<Integer> ints = new ArrayList<Integer>();

Następnie, aby zmienić używaną listę ints.add(y)i ints.remove(z)spośród wielu innych przydatnych metod, można znaleźć w odpowiednich Javadocach.

Zdecydowanie polecam przestudiowanie klas kolekcji dostępnych w Javie, ponieważ są one bardzo potężne i zapewniają wiele wbudowanych funkcji, które nowicjusze Java zwykle próbują niepotrzebnie przepisywać.

MattGrommes
źródło
chcę pracować, dopóki nie spróbuję: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm
5
Dlaczego używasz List<Integer>zamiast ArrayList<Integer>?
Dean Meehan
25

Tablice mają stały rozmiar po utworzeniu wystąpienia. Zamiast tego możesz użyć listy.

Autoboxing sprawia, że ​​lista staje się użyteczna jak tablica, możesz umieścić w niej po prostu wartości int:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Mnementh
źródło
2
Dlaczego deklarujesz zmienną referencyjną typu List, a nie ArrayList?
LppEdd
2
Ponieważ pozwala ci to po prostu przełączać się między implementacjami List w razie potrzeby, musisz tylko zmienić nową XYZList (). Jeśli zmienna jest zadeklarowana jako ArrayList, oyu może użyć metod specyficznych dla tej implementacji, utrudniając zmianę.
Mnementh
1
Dzięki, rozumiem.
LppEdd
11

Nie zgadzam się z poprzednimi odpowiedziami sugerującymi ArrayList, ponieważ nieArrayList jest to tablica dynamiczna, ale lista obsługiwana przez tablicę. Różnica polega na tym, że nie możesz wykonać następujących czynności:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

Daje ci wyjątek IndexOutOfBoundsException, ponieważ nie ma jeszcze elementu w tej pozycji, mimo że tablica zapasowa pozwoliłaby na takie dodanie. Musisz więc użyć niestandardowej rozszerzalnej implementacji tablicy, takiej jak sugerowana przez @ randy-lance

cspann
źródło
Wierzę, że chciał połączyć go codereply.com/answer/6i5bur/java-dynamic-arrays.html
Amit Kumar Gupta
Nie jestem pewien, czy ArrayList ma jakąkolwiek metodę put, jak widzę w kodzie źródłowym Java8. Po prostu próbuję dowiedzieć się, jak zachowuje się przy danej pojemności. Jednak znaleziono metodę ArrayList.add ().
Sanjeet A
11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

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

}

Źródło: jak zrobić tablicę dynamiczną

Anuj Dhiman
źródło
7
  1. Zaleca się używanie listy w przypadku małej skali.

  2. Jeśli masz ogromną liczbę numerów, NIGDY nie używaj listy i autoboxingu,

    Lista <liczba całkowita> lista

Dla każdego int, automatycznie tworzona jest nowa liczba całkowita. Przekonasz się, że zwalnia, gdy rozmiar listy rośnie. Te liczby całkowite są niepotrzebnymi obiektami. W takim przypadku użycie szacowanego rozmiaru byłoby lepsze,

int[] array = new int[ESTIMATED_SIZE];
Hao Deng
źródło
4

Co powiesz na użycie Listzamiast tego? Na przykład,ArrayList<integer>

Konrad Garus
źródło
4

Nie możesz zmienić rozmiaru tablicy. Możesz jednak utworzyć nową tablicę o odpowiednim rozmiarze i skopiować dane ze starej tablicy do nowej.

Ale najlepszą opcją jest użycie IntList z jacarta commons. ( tutaj )

Działa podobnie jak List, ale zajmuje mniej miejsca i jest bardziej wydajne, ponieważ przechowuje wartości int zamiast przechowywania obiektów opakowujących nad wartościami int (tym jest klasa Integer).

Thiago Chaves
źródło
-4

Odpowiedziałem na to pytanie i nie, nie potrzebujesz arraylisty ani żadnej innej rzeczy, to było zadanie i ukończyłem je, aby tak, tablice mogły zwiększyć rozmiar. Oto link Jak używać tablicy dynamicznej Java, a tutaj jest łącze do mojego pytania, na które odpowiedziałem tablice dynamiczne Java

Nikt
źródło
1
to jest po prostu złe. połączona odpowiedź wywołuje System.arrayCopy (), kopiując starą tablicę do nowej o zwiększonym rozmiarze, a następnie dodając nowy wpis. tablice nadal nie mogą mieć rozmiaru dynamicznego.
katzenhut