Domanda

In Java, possiamo sempre usare un array per memorizzare i riferimenti agli oggetti. Quindi abbiamo una ArrayList o una HashTable che è automaticamente espandibile per memorizzare oggetti. Ma qualcuno conosce un modo nativo per avere una matrice espandibile automaticamente di riferimenti a oggetti?

Modifica: voglio dire se desidero sapere se l'API Java ha una classe con la capacità di memorizzare i riferimenti agli oggetti (ma non la memorizzazione dell'oggetto reale come fanno XXXList o HashTable) E la capacità di autoespansione.

È stato utile?

Soluzione

Gli array Java sono, per definizione, dimensioni fisse. Se hai bisogno di crescita automatica, usi le classi XXXList.

EDIT - la domanda è stata chiarita un po '

Quando stavo iniziando a imparare Java (proveniente da uno sfondo C e C ++), questa è stata probabilmente una delle prime cose che mi ha fatto scattare. Spero di poter far luce.

A differenza del C ++, gli array di oggetti in Java non non memorizzano oggetti. Memorizzano i riferimenti agli oggetti.

In C ++, se hai dichiarato qualcosa di simile a:

String myStrings[10];

Otterresti 10 oggetti String. A questo punto, sarebbe perfettamente legale fare qualcosa come println (myStrings [5] .length); - otterresti '0' - il costruttore predefinito per String crea una stringa vuota con lunghezza 0.

In Java, quando si costruisce un nuovo array, si ottiene un contenitore vuoto che può contenere riferimenti a 10 stringhe. Quindi la chiamata:

String[] myStrings = new String[10];
println(myStringsp[5].length);

genererebbe un'eccezione puntatore null, perché non hai ancora inserito un riferimento String nell'array.

Se provieni da uno sfondo C ++, pensa alla nuova stringa [10] come equivalente alla nuova (stringa *) [10] da C ++.

Quindi, con questo in mente, dovrebbe essere abbastanza chiaro perché ArrayList è la soluzione per un array di oggetti autoespandibile (e in effetti, ArrayList è implementato usando array semplici, con un algoritmo di crescita incorporato che alloca i nuovi array espansi in base alle esigenze e copia il contenuto dal vecchio al nuovo).

In pratica, in realtà ci sono relativamente poche situazioni in cui utilizziamo le matrici. Se stai scrivendo un contenitore (qualcosa di simile a ArrayList o BTree), allora sono utili, o se stai facendo molta manipolazione di byte a basso livello - ma al livello in cui si verifica la maggior parte dello sviluppo, usando una delle classi Collezioni è di gran lunga la tecnica preferita.

Altri suggerimenti

Tutte le classi che implementano Collection sono espandibili e memorizzano solo riferimenti: non memorizzi oggetti, li crei in alcuni spazi di dati e li manipoli solo fino a quando non escono dall'ambito senza riferimento su di essi.

È possibile inserire un riferimento a un oggetto in due o più raccolte. Ecco come è possibile ordinare le tabelle hash e così via ...

Che cosa intendi con " nativo " modo? Se si desidera un elenco espandibile di oggetti, è possibile utilizzare ArrayList. Con le raccolte Elenco è disponibile il metodo get (indice) che consente di accedere agli oggetti nell'elenco per indice, offrendo funzionalità simili a un array. Internamente ArrayList è implementato con un array e ArrayList gestisce l'espansione automatica per te.

Direttamente dal Array Java Tutorials su la pagina web del sole:

- > Un array è un oggetto contenitore che contiene un risolto numero di valori di un singolo tipo.

Poiché la dimensione dell'array viene dichiarata quando viene creata, in realtà non c'è modo di espanderla in seguito. Lo scopo di dichiarare un array di una certa dimensione è di allocare solo la memoria che sarà probabilmente usata quando il programma verrà eseguito. Quello che potresti fare è dichiarare un secondo array che è una funzione basata sulla dimensione dell'originale, copiare tutti gli elementi originali in esso e quindi aggiungere i nuovi elementi necessari (anche se questo non lo è molto "automatico" :)). Altrimenti, come hai già detto tu e pochi altri, le raccolte di elenchi sono il modo più efficiente di procedere.

In Java, tutte le variabili oggetto sono riferimenti. Quindi

Foo myFoo = new Foo();
Foo anotherFoo = myFoo;

significa che entrambe le variabili si riferiscono allo stesso oggetto, non a due copie separate. Allo stesso modo, quando si inserisce un oggetto in un Collection , si memorizza solo un riferimento all'oggetto. Pertanto, utilizzare ArrayList o simile è il modo corretto di disporre di un archivio di archiviazione che si espande automaticamente.

Non esiste un costrutto linguistico di prima classe che faccia ciò di cui sono a conoscenza, se è quello che stai cercando.

Non è molto efficiente, ma se stai semplicemente aggiungendo un array, puoi usare Apache Commons ArrayUtils.add ( ) . Restituisce una copia dell'array originale con l'elemento aggiuntivo in esso.

se puoi scrivere il tuo codice in javascript, sì, puoi farlo. le matrici javascript sono matrici sparse. si espanderà nel modo desiderato.

puoi scrivere

a [0] = 4;
a [1000] = 434;
a [888] = " a string " ;;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top