Ho letto che in Java un oggetto di tipo String non può cambiare. Ma le variabili int e char possono. Perché è? Puoi darmi un esempio?La stringa non può cambiare. Ma int, char può cambiare
Grazie. (I am a newer -_-)
Ho letto che in Java un oggetto di tipo String non può cambiare. Ma le variabili int e char possono. Perché è? Puoi darmi un esempio?La stringa non può cambiare. Ma int, char può cambiare
Grazie. (I am a newer -_-)
Come ha detto bzabhi, le stringhe sono immutabili in Java. Ciò significa che un oggetto stringa non cambierà mai. Ciò non significa che non è possibile modificare le variabili stringa, solo che non è possibile modificare la rappresentazione della memoria sottostante della stringa. per un esempio:
String str = "Hello";
str += " World!";
Dopo l'esecuzione di queste righe, str indicherà una nuova stringa in memoria. La stringa originale "Hello" esiste ancora in memoria, ma molto probabilmente non ci sarà a lungo. Supponendo che non ci siano circostanze attenuanti, nulla indicherà la stringa originale, quindi sarà raccolta dei dati inutili.
Credo che il modo migliore per mettere questo sarebbe quello di dire che quando la linea 2 della esempio esegue, una nuova stringa in memoria viene creata dalla concatenazione della stringa originale e la stringa che si aggiunge ad esso. La variabile str, che è solo un riferimento a una posizione di memoria, viene quindi modificata in modo da puntare alla nuova variabile appena creata.
Non sono particolarmente informato sul punto, ma, a quanto ho capito, questo è ciò che accade con tutti i valori "non primitivi". Tutto ciò che ad un certo punto deriva da Object segue queste regole. I valori primitivi, come ints, bool, char, float e double consentono di modificare il valore reale in memoria. Quindi, da questo:
int num = 5;
num += 2;
il valore effettivo nella memoria cambia. Piuttosto che creare un nuovo oggetto e cambiare il riferimento, questo esempio di codice cambierà semplicemente il valore in memoria per la variabile num.
Per quanto riguarda il motivo per cui questo è vero, è semplicemente una decisione progettuale dei produttori di Java. Sono sicuro che qualcuno commenterà perché è stato fatto, ma non è qualcosa che conosco.
* Perché? * Sto solo indovinando qui, ma probabilmente è perché se dovessi estendere una stringa dovresti ridistribuire comunque la memoria. I caratteri vengono archiviati in modo contiguo e il seguente carattere potrebbe non essere disponibile per l'uso, pertanto consente di riallocare un nuovo blocco di memoria in entrambi i casi. – mpen
, ad esempio: è più efficiente in questo modo (nella maggior parte dei casi). A meno che non si voglia allocare stringhe enormi solo per un uso potenziale. Ma questo è ciò che StringBuffer è per ... – mpen
(Paragonerei 'int' a' Integer' - si comportano in modo molto simile. 'AtomicInteger' e' StringBuilder', ad esempio, si comportano in modo molto diverso da 'Integer' /' int' e 'String'.) –
int e char non possono essere modificati. Come con le stringhe, puoi inserire un valore diverso nella stessa variabile, ma un numero intero di per sé non cambia. 3 sarà sempre 3; non è possibile modificarlo per essere 4.
Non sono sicuro che sia possibile mostrare (ad esempio) che le stringhe non possono cambiare. Ma puoi confermare ciò leggendo la sezione di descrizione di Javadoc for the String class, quindi leggendo la sezione dei metodi e notando che non ci sono metodi che possono cambiare una stringa.
EDIT: Esistono molte ragioni per cui le stringhe sono progettate per essere immutabili in Java. La ragione più importante è che le stringhe immutabili sono più facili da usare correttamente rispetto a quelle mutevoli. E se per qualche motivo hai bisogno dell'equivalente mutabile di una stringa, puoi usare la classe StringBuilder (o StringBuffer).
Questo piccolo articolo può probabilmente spiegare meglio di me: http://www.jchq.net/tutorial/09_02Tut.htm
String è un tipo immutabile, (il valore all'interno di esso non può cambiare). Lo stesso vale per tutti i tipi primitivi (booleano, byte, char, short, int, long, float e double).
int x;
String s;
x = 1;
x = 2;
s = "hello";
s = "world";
x++; // x = x + 1;
x--; // x = x - 1;
Come si può vedere, in nessun caso si può modificare il valore costante (1, 2, "ciao", "mondo"), ma è possibile modificare in cui sono puntate (se deformare la mente un po ' e dire che una variabile int indica un valore int costante).
Vale anche la pena notare che, poiché le stringhe sono immutabili, che se vengono passate in un metodo, non possono essere modificate all'interno del metodo e quindi devono avere quelle modifiche viste al di fuori dell'ambito del metodo.
public void changeIt(String s) {
// I can't do anything to s here that changes the value
// original string object passed into this method
}
public void changeIt(SomeObject o) {
// if SomeObject is mutable, I can do things to it that will
// be visible outside of this method call
}
Le stringhe sono immutabili in java
. Tuttavia, è comunque possibile aggiungere o anteporre valori alle stringhe. Per valori, intendo tipi di dati primitivi o altre stringhe.
Tuttavia, uno StringBuffer è modificabile, ovvero può essere modificato in memoria (non è necessario allocare un nuovo blocco di memoria), il che lo rende piuttosto efficiente. Inoltre, si consideri il seguente esempio:
StringBuffer mystringbuffer = new StringBuffer(5000);
for (int i = 0; i<=1000; i++)
{
mystringbuffer.append ('Number ' + i + '\n');
}
System.out.print (mystringbuffer);
Anziché creare mille corde, creiamo un singolo oggetto (mystringbuffer
), che può espandersi in lunghezza. Possiamo anche impostare una dimensione iniziale raccomandata (in questo caso, 5000 byte), il che significa che non è necessario che il buffer richieda continuamente la memoria quando viene aggiunta una nuova stringa.
Mentre un StringBuffer
non migliora l'efficienza in ogni situazione, se l'applicazione utilizza stringhe che crescono in lunghezza, sarebbe efficiente. Il codice può anche essere più chiaro con StringBuffer
s, perché il metodo append ti evita di dover utilizzare istruzioni di assegnazione lunghe.
Cosa intendi, non può cambiare? Che ne dici di darci un esempio di ciò che stai descrivendo? – user151841
Benvenuti in SO. Penso che dovrai essere un po 'più descrittivo per ottenere una risposta costruttiva. :) –
non capisco perché questo ragazzi ottiene un downvote. è un principiante e sta semplicemente facendo una domanda. con il voto basso, lo stai scoraggiando. e non riesco a vedere cosa c'è di sbagliato nella domanda, è una valida! –