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

    chiarimento su puntamenti

    Ciao a tutti,
    mi sono imbattuto in un problema per me strano, penso che per voi sia semplice. Ho questo codice:
    Codice PHP:
    TreeMap<IntegerStringprova1 = new TreeMap<IntegerString>();
    TreeMap<IntegerStringprova2 = new TreeMap<IntegerString>();
    TreeMap<IntegerStringcomune = new TreeMap<IntegerString>();

    comune.put(1"a");

    prova1 comune;
    prova2 comune;

    prova1.put(2"b");

    Set c prova2.keySet();
    Iterator itr c.iterator();

    while(
    itr.hasNext()){
        
    System.out.println((Integer)itr.next());

    Questo codice da in output:


    1
    2


    Io mi sarei aspettato come output solo 1, in quanto prova1 è impostato uguale a comune, ma comune non è impostato uguale a prova2, è il contrario.
    Non so se mi sono spiegato, io ragiono come se avessi:
    Codice PHP:
    String prova1 "";
    String prova2 "";
    String comune "a";

    prova1 comune;
    prova2 comune;

    prova2 "b";

    System.out.println(prova1); 
    In questo caso mi aspetto che il risultato sia a e infatti è così. Ma cosa cambia rispetto al primo esempio?

    Immagino sia una cosa banale, ma ringrazio se qualcuno mi aiuta a chiarirmi le idee.

    Matteo

  2. #2
    Nel primo esempio non stai facendo una copia delle treemap, ovvero in memoria succede questo:

    codice:
    INIZIO
    prova1 ---------->  [TREE_MAP_1]
    prova2 ---------->  [TREE_MAP_2]
    comune ----------> [TREE_MAP_3]
    
    comune.put(1,"a")
    prova1 ---------->  [TREE_MAP_1]
    prova2 ---------->  [TREE_MAP_2]
    comune ----------> [TREE_MAP_3]{[1,"a"]}
    
    prova1=comune
    prova1 ----XXX--->  [TREE_MAP_1] (viene eliminato il riferimento e la treemap va a disposizione del garbage collector che prima o poi la eliminera')
    prova2 ---------->  [TREE_MAP_2]
    
    prova1-----------> (adesso anche questo punta a TREE_MAP_3
    comune ----------> [TREE_MAP_3]{[1,"a"]}
    
    prova2=comune
    prova2 ----XXX--->  [TREE_MAP_2] viene eliminato il riferimento e la treemap va a disposizione del garbage collector che prima o poi la eliminera')
    
    prova2-----------> (adesso anche questo punta a TREE_MAP_3)
    prova1-----------> (adesso anche questo punta a TREE_MAP_3)
    comune ----------> [TREE_MAP_3]{[1,"a"]}
    
    prova1.put(2,"b")
    prova2-----------> (adesso anche questo punta a TREE_MAP_3)
    prova1-----------> (adesso anche questo punta a TREE_MAP_3)
    comune ----------> [TREE_MAP_3]{[1,"a"], [2,"b"]}
    le stringhe invece vengono sempre passate per valore, come anche tutti i tipi primitivi, quindi nel tuo esempio, quando fai prova1=comune viene creata una copia di comune (che conteneva "a") e quando stampi prova1 ovviamente stampi quindi a. Alla fine dell esempio, prova1 vale a, comune vale a e prova2 vale b.
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

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

    Re: chiarimento su puntamenti

    Originariamente inviato da Teo80
    Codice PHP:
    TreeMap<IntegerStringprova1 = new TreeMap<IntegerString>();
    TreeMap<IntegerStringprova2 = new TreeMap<IntegerString>();
    TreeMap<IntegerStringcomune = new TreeMap<IntegerString>(); 
    Fino a qui hai 3 oggetti TreeMap distinti e ognuna delle variabili fa riferimento ad un oggetto TreeMap diverso.

    Originariamente inviato da Teo80
    Codice PHP:
    prova1 comune;
    prova2 comune
    Facendo così, le variabili prova1, prova2 fanno entrambe riferimento all'oggetto TreeMap referenziato da comune. Ora hai solo più 1 oggetto (degli altri 2 hai "perso" il riferimento e gli oggetti finiranno in pasto al garbage collector), che è referenziato da tutte le 3 variabili. Ed è chiaro che se l'oggetto è 1 solo, che tu usi prova1, prova2 o comune per aggiungere qualcosa, andrà tutto nello stesso TreeMap!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.