Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    Piccolo dubbio sulle stringhe in Java

    Ciao,
    se io ho una semplicissima classe del genere (includo solo le variabili di istanza ed il costruttore che è l'unica cosa che mi interessa circa il mio dubbio):

    codice:
    public class CoppiaDiOggetti{
    	
    	private String p;
    	private int[] q;
    	
    	/** COSTRUTTORE */
    	
    	public CoppiaDiOggetti(String s, int[] V){
    		p = s;
    		q = V;
    	}
    }
    Quando nel main vado a creare un nuovo oggetto istanza di CoppiaDiOggetti che succede in memoria?

    Per esempio se nel main ho qualcosa come:

    codice:
    .........................
    String a = "Ciao";
    int [] x = {1,2,3}
    CoppiaDiOggetti C = new CoppiaDiOggetti(b,x);
    .........................
    Nello heap crea prima l'oggetto a di tipo String che contiene la stringa "Ciao", poi crea l'oggetto x di tipo int[] che contiene l'array.

    Poi crea l'oggetto C di tipo CoppiaDiOggetti che conterrà il riferimento all'array ricevuto nel parametro del costruttore (quindi un riferimento ad x) ed il riferimento alla stringa ricevuta come parametro nel costruttore (quindi la stringa a)? E' corretto?!?!

    Ho un dubbio...mi pare di ricordare che la proff avesse detto che in Java le stringhe fossero costanti quindi mi viene il dubbio che venga costruita una nuova stringa e che nell'oggetto C ci sia il riferimento a questa nuova stringa che contiene lo stesso valore della stringa a....anche se forse era che se modificavo una stringa, visto che per Java sono costanti ne creava un'altra....
    Com'è sta cosa?

    Grazie
    Andrea

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Piccolo dubbio sulle stringhe in Java

    Originariamente inviato da D4rkAng3l
    Nello heap crea prima l'oggetto a di tipo String che contiene la stringa "Ciao"
    In realtà "Ciao" è una stringa "literal" e come tale sta in una area un po' particolare chiamata "constant pool".

    Originariamente inviato da D4rkAng3l
    Poi crea l'oggetto C di tipo CoppiaDiOggetti che conterrà il riferimento all'array ricevuto nel parametro del costruttore (quindi un riferimento ad x) ed il riferimento alla stringa ricevuta come parametro nel costruttore (quindi la stringa a)? E' corretto?!?!
    Diciamo ok.

    Originariamente inviato da D4rkAng3l
    Ho un dubbio...mi pare di ricordare che la proff avesse detto che in Java le stringhe fossero costanti
    Gli oggetti String sono "immutabili" ovvero il loro contenuto non può essere modificato (nessun metodo di String cambia lo stato dell'oggetto).

    Originariamente inviato da D4rkAng3l
    quindi mi viene il dubbio che venga costruita una nuova stringa e che nell'oggetto C ci sia il riferimento a questa nuova stringa che contiene lo stesso valore della stringa a....
    No, quelle assegnazioni nel costruttore copiano proprio solo il valore del reference. Non viene creata alcuna nuova stringa!
    Quindi la variabile 'a' e la variabile 'p' del'oggetto CoppiaDiOggetti effettivamente hanno lo stesso valore cioè lo stesso reference a quella stringa literal "Ciao".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Giusto per completezza, questo è un discorso che va esteso oltre il caso delle String

    Ad esempio, supponendo di avere una situazione del genere:

    Codice PHP:
    double unNumero 5.0;
    double unAltroNumero unNumero;

    ClassePropria unaIstanza = new ClassePropria();
    ClassePropria unAltraIstanza unaIstanza
    La variabile unAltroNumero assumerà lo stesso valore della variabile unNumero , ma le due variabili rimarranno indipendenti l'una dall'altra. Il valore della variabile unNumero verrà infatti copiato nella variabile unAltroNumero. Se una delle due variabili viene modificata successivamente, l'altra variabile non subirà modifiche.

    Diverso è il discorso per i reference. Il reference unAltraIstanza assumerà il valore (cioè l'indirizzo) del reference unaIstanza . Ciò significa che unAltraIstanza punterà allo stesso oggetto cui punta unaIstanza. Quindi se in seguito sarà applicata una qualche modifica all'oggetto comune tramite uno dei due reference, ovviamente questa sarà riscontrabile anche tramite l'altro reference.

    Questa è grosso modo la situazione che si presenta in memoria:

    codice:
               ___
    unNumero  |5.0|
                    ___
    unAltroNumero  |5.0|
    
                 __________             _
    unaIstanza  |0XABCD2346| --------->|
                      __________       |
    unaAltraIstanza  |0XABCD2346| ---->|          Oggetto di tipo ClassePropria
                                       |
                                       |     variabile1
                                       |     variabile2
                                       |     .....
                                       |_
    Al mio segnale... scatenate l'inferno!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.