Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130

    curiosita' sulle stringhe

    ciao

    volevo alcuni dettagli sulla faccenda stringhe in java. Ho letto che quando si usano stringhe literal allora se, sono uguali (se contengono gli stessi caratteri), java le internalizza e le fa puntare alla stessa area in memoria.

    codice:
    String a = "yo";
    String b = "yo";        
    (a == b); // true
    mentre se facciamo una istanziazione classica non si internalizza una tega e le aree puntate in memoria sono diverse anche se le 2 strighe contengono gli stessic aratteri:

    codice:
    String c = new String("yo");
    String d = new String("yo");
    String b = "yo";        
    (a == b); // false
    solo che non capisco perche l'hashcode per tutte e 4 queste stringhe e' lo stesso. Mi aspetttavo fosse uguale per a e b ma diverso per c e d

    capisc'?

    Thanks

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

    Re: curiosita' sulle stringhe

    Originariamente inviato da nourdine
    quando si usano stringhe literal allora se, sono uguali (se contengono gli stessi caratteri), java le internalizza e le fa puntare alla stessa area in memoria.
    Esatto ... nel "constant pool" ce n'è 1 sola.

    Originariamente inviato da nourdine
    mentre se facciamo una istanziazione classica non si internalizza una tega e le aree puntate in memoria sono diverse anche se le 2 strighe contengono gli stessic aratteri:
    Esatto. "new X" = nuovo oggetto X. Sempre. E se sono 2 oggetti distinti .... i loro reference ovviamente non possono essere uguali!

    Originariamente inviato da nourdine
    solo che non capisco perche l'hashcode per tutte e 4 queste stringhe e' lo stesso. Mi aspetttavo fosse uguale per a e b ma diverso per c e d
    A parte per java.lang.Object che non ha "stato" e il suo hashCode() si basa internamente sull' "indirizzo" dell'oggetto, per altre classi che hanno una implementazione "appropriata" di hashCode(), il calcolo del hash code si dovrebbe basare solo sul "contenuto" dell'oggetto. E per un String il "contenuto" è la sequenza di caratteri. Stessa sequenza di caratteri = stesso hash code.

    E questo comunque è ben specificato e richiesto dal "contratto" tra equals() e hashCode(). Se due oggetti sono uguali secondo equals(), allora devono avere lo stesso hash code.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130

    Re: Re: curiosita' sulle stringhe

    E per un String il "contenuto" è la sequenza di caratteri. Stessa sequenza di caratteri = stesso hash code.
    hehe vedi? io credevo che hashcode restituisse un id dell'oggetto stesso. Cioe' come dici tu fa proprio quello in Object (e per cui in ogni classe da noi scritta in cui equals non e' esplicitamente overridato) ma non in String dove il metodo fa appunto il controllo carattere per carattere di cui parli!

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

    Re: Re: Re: curiosita' sulle stringhe

    Originariamente inviato da nourdine
    io credevo che hashcode restituisse un id dell'oggetto stesso.
    No, l'obiettivo di hashCode() è quello di fornire un valore che sia il più possibilmente "distinto" per oggetti diversi. Insomma, vedendola in modo diverso, l'obiettivo è quello di fornire valori che causino "collisioni" il meno possibile. Collisioni che comunque sono possibili, a seconda del modo di calcolare il hash code.

    Prendiamo ad esempio Integer. Esso contiene un int. E il suo hashCode() ritorna direttamente quel int. Questo è un caso particolare in cui non ci sono collisioni (solo per Integer). Non è possibile che 2 Integer con valore diverso abbiano lo stesso hash code.
    Prendiamo invece Long. Esso contiene un long ma hashCode() restituisce un int. Cosa fa il suo hashCode()? Fa uno XOR della parte alta con la parte bassa. Le collisioni quindi sono possibili. Due Long con valori diversi possono avere lo stesso hash code!!

    codice:
    Long a = new Long(0x0000000100000001L);
    Long b = new Long(0x0000000500000005L);
    System.out.println(a.hashCode() + "  " + b.hashCode());
    Stampa 0 0. Ovvero stesso hash code anche se i Long hanno valore completamente diverso.
    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.