Array di lunghezza variabile (dinamici) in Java


108

Mi chiedevo come inizializzare un array intero in modo tale che le sue dimensioni ei valori cambino durante l'esecuzione del mio programma, qualche suggerimento?

Risposte:


121

Sì: usa ArrayList .

In Java, gli array "normali" sono di dimensione fissa. Devi dare loro una dimensione e non puoi espanderli o contrarli. Per modificare le dimensioni, devi creare un nuovo array e copiare i dati desiderati, il che è inefficiente e un problema per te.

Fortunatamente, ci sono tutti i tipi di classi incorporate che implementano strutture di dati comuni e anche altri strumenti utili. Ti consigliamo di controllare l'API Java 6 per un elenco completo di essi.

Un avvertimento: ArrayList può contenere solo oggetti (es. Numeri interi), non primitive (es. Int). Nella MAGGIOR PARTE dei casi, l' autoboxing / autounboxing si prenderà cura di questo per te in silenzio, ma potresti ottenere un comportamento strano a seconda di ciò che stai facendo.


2
Mi chiedo perché il codice seguente sia corretto in java? int[] array = new int[size]; sizeè una variabile, ma la lunghezza di un array deve essere corretta, ho ragione? @Lord Torgamus
jerry_sjtu

12
@jerry_sjtu sì, l'array non cambia la dimensione per adattarsi sizementre il programma va avanti; ottiene qualsiasi dimensione si trovi sizequando quella riga viene eseguita.
Pop dal

Ogni volta che rimuovo un elemento da un ArrayList, mi ritrovo con un nullalla fine. Qualche idea sul perché?
Aaron Franke

37

Gli array in Java hanno dimensioni fisse. Quello che ti serve è un ArrayList, una delle numerose collezioni estremamente preziose disponibili in Java.

Invece di

Integer[] ints = new Integer[x]

usate

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

Quindi, per cambiare l'elenco che usi ints.add(y)e ints.remove(z)tra molti altri metodi utili puoi trovare nei Javadoc appropriati.

Consiglio vivamente di studiare le classi Collections disponibili in Java in quanto sono molto potenti e offrono molte funzionalità integrate che i novellini di Java tendono a provare a riscrivere se stessi inutilmente.


voglio lavorare finché non ho provato: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm

5
Perché usi List<Integer>invece di ArrayList<Integer>?
Dean Meehan

24

Gli array hanno una dimensione fissa una volta istanziati. Puoi invece usare un elenco.

L'autoboxing rende un List utilizzabile simile a un array, puoi inserire semplicemente valori int:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
Perché dichiari una variabile di riferimento di tipo List e non ArrayList?
LppEdd

2
Poiché ti consente di passare semplicemente tra le implementazioni di List, se necessario, devi solo modificare il nuovo XYZList (). Se la variabile viene dichiarata come ArrayList oyu potrebbe utilizzare metodi specifici per questa implementazione, rendendo la modifica più complicata.
Mnementh

1
Grazie, ho capito.
LppEdd

11

Non sono d'accordo con le risposte precedenti che suggeriscono ArrayList, perché nonArrayList è un array dinamico ma un elenco supportato da un array. La differenza è che non puoi fare quanto segue:

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

Ti darà un'eccezione IndexOutOfBoundsException perché non c'è ancora alcun elemento in questa posizione anche se l'array di supporto consentirebbe tale aggiunta. Quindi è necessario utilizzare un'implementazione Array estensibile personalizzata come suggerito da @ randy-lance



Non sono sicuro che ArrayList abbia un metodo put come vedo nel codice sorgente Java8. Sto solo cercando di scoprire come si comporta con una data capacità. Tuttavia trovato il metodo 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]);
}    
}

}

Fonte: come creare un array dinamico


7
  1. Si consiglia di utilizzare List per gestire dimensioni ridotte.

  2. Se hai un numero enorme di numeri, non usare MAI List e l'autoboxing,

    Elenco <Intero> elenco

Per ogni singolo int, viene creato automaticamente un nuovo Integer. Troverai che rallenta quando la dimensione dell'elenco aumenta. Questi numeri interi sono oggetti non necessari. In questo caso, sarebbe meglio utilizzare una taglia stimata,

int[] array = new int[ESTIMATED_SIZE];


4

Non è possibile modificare la dimensione di un array. Tuttavia, è possibile creare un nuovo array con le dimensioni corrette e copiare i dati dal vecchio array al nuovo.

Ma la tua migliore opzione è usare IntList da jacarta commons. ( qui )

Funziona proprio come un List, ma occupa meno spazio ed è più efficiente di così, perché memorizza gli int invece di memorizzare gli oggetti wrapper sugli int (ecco cos'è la classe Integer).


-4

Ho risposto a questa domanda e no, non è necessario un elenco di elenchi o qualsiasi altra cosa, questo era un compito e l'ho completato in modo che gli array possano aumentare di dimensioni. Ecco il link Come usare Java Dynamic Array e qui è il link per la mia domanda a cui ho risposto agli array Java Dynamic


1
questo è semplicemente sbagliato. la risposta collegata chiama System.arrayCopy (), copiando il vecchio array in uno nuovo di dimensioni maggiori, quindi aggiungendo la nuova voce. gli array non possono ancora avere una dimensione dinamica.
katzenhut
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.