Visualizzazione dei risultati da 1 a 9 su 9

Discussione: HashMap e LinkedHasMap

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Alexander_37 Visualizza il messaggio
    Nel secondo caso ho creato un LinkedHasMap passandolo nel set dell'oggetto Test3. Quando chiamo il get maps dell'instanza Test3, non vado a usare comunque un'HashMap?
    Come tipo statico "vedi" un HashMap, perché getMaps dichiara come ritorno appunto un HashMap.
    Ma l'oggetto che è stato istanziato e passato a setMaps è realmente un LinkedHashMap ... è questo che conta!


    P.S. il codice è stato postato male, senza i newline corretti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #2
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Come tipo statico "vedi" un HashMap, perché getMaps dichiara come ritorno appunto un HashMap.
    Ma l'oggetto che è stato istanziato e passato a setMaps è realmente un LinkedHashMap ... è questo che conta!


    P.S. il codice è stato postato male, senza i newline corretti.

    Scusami non avevo visto il codice . Grazie per le continue risposte che continui a darmi. . Praticamente se passo ad un oggetto HashMap un oggetto LinkedHashMap (essendo la classe madre), quando uso il get lavoro con l'oggetto Linked giusto?

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Alexander_37 Visualizza il messaggio
    se passo ad un oggetto HashMap
    No, attenzione: non "ad un oggetto". Hai un LinkedHashMap, tu passi a qualcun'altro il reference a questo oggetto.

    Il fatto che nell'esempio postato i getMaps/setMaps trattano HashMap è solo la "visione" del tipo del reference che hanno. Quando invochi getMaps sai solo che l'oggetto è sicuramente come minimo un HashMap ma quale è il tipo reale dell'oggetto non lo "sai", perché potrebbe essere un sottotipo. Quindi puoi solo invocare metodi noti ad HashMap.

    Non puoi invocare es. removeEldestEntry (che è specifico di LinkedHashMap) perché "vedi" l'oggetto solo come HashMap. Ma se l'oggetto realmente è un LinkedHashMap, allora se invochi get è quello della classe LinkedHashMap (perché ridefinisce il get) e non quello di HashMap.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, attenzione: non "ad un oggetto". Hai un LinkedHashMap, tu passi a qualcun'altro il reference a questo oggetto.

    Il fatto che nell'esempio postato i getMaps/setMaps trattano HashMap è solo la "visione" del tipo del reference che hanno. Quando invochi getMaps sai solo che l'oggetto è sicuramente come minimo un HashMap ma quale è il tipo reale dell'oggetto non lo "sai", perché potrebbe essere un sottotipo. Quindi puoi solo invocare metodi noti ad HashMap.

    Non puoi invocare es. removeEldestEntry (che è specifico di LinkedHashMap) perché "vedi" l'oggetto solo come HashMap. Ma se l'oggetto realmente è un LinkedHashMap, allora se invochi get è quello della classe LinkedHashMap (perché ridefinisce il get) e non quello di HashMap.
    Ok .
    Nel secondo caso t2 quando userò il getMaps però potrò usufruire dei metodi getter e setter del linkedMap mentre nel t soltanto quelli dell'Hashmap ?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Alexander_37 Visualizza il messaggio
    Nel secondo caso t2 quando userò il getMaps però potrò usufruire dei metodi getter e setter del linkedMap mentre nel t soltanto quelli dell'Hashmap ?
    Allora:

    HashMap<String,String> hm = new LinkedHashMap<String,String>();

    Nota che qui la variabile (ovvero il tipo "statico" del reference) è HashMap mentre l'oggetto realmente istanziato e assegnato è un LinkedHashMap.

    Su hm puoi invocare solo metodi "noti" ad HashMap. Non puoi invocare i metodi specifici di LinkedHashMap come ad esempio removeEldestEntry. Ma questo è principalmente per come funziona Java.
    Java è un linguaggio statically-typed, ovvero il compilatore effettua in anticipo tutta una serie di controlli. Non è come in altri linguaggi "dinamici" dove se un campo/metodo esiste realmente o no lo si scopre solo a runtime!

    Ma tutti i metodi noti ad HashMap li puoi invocare. Alcuni metodi possono essere definiti solo in HashMap, altri ridefiniti da LinkedHashMap. Ad esempio il get è ridefinito da LinkedHashMap perché deve fare qualcosa in più mentre il size() rimane quello di HashMap perché è già corretto/sensato anche per LinkedHashMap visto che il grosso è appunto implementato in HashMap.

    Queste finezze però alla fine non interessano più di tanto. L'oggetto è realmente un LinkedHashMap quindi nella sua interezza il comportamento è quello di LinkedHashMap. Che rispetto a HashMap ha solo in più la capacità di poter garantire un insertion-order o al limite un access-order. E questo lo puoi sfruttare anche "vedendo" l'oggetto come HashMap, perché non è una questione di metodo in più o no ma di "comportamento".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Allora:

    HashMap<String,String> hm = new LinkedHashMap<String,String>();

    Nota che qui la variabile (ovvero il tipo "statico" del reference) è HashMap mentre l'oggetto realmente istanziato e assegnato è un LinkedHashMap.

    Su hm puoi invocare solo metodi "noti" ad HashMap. Non puoi invocare i metodi specifici di LinkedHashMap come ad esempio removeEldestEntry. Ma questo è principalmente per come funziona Java.
    Java è un linguaggio statically-typed, ovvero il compilatore effettua in anticipo tutta una serie di controlli. Non è come in altri linguaggi "dinamici" dove se un campo/metodo esiste realmente o no lo si scopre solo a runtime!

    Ma tutti i metodi noti ad HashMap li puoi invocare. Alcuni metodi possono essere definiti solo in HashMap, altri ridefiniti da LinkedHashMap. Ad esempio il get è ridefinito da LinkedHashMap perché deve fare qualcosa in più mentre il size() rimane quello di HashMap perché è già corretto/sensato anche per LinkedHashMap visto che il grosso è appunto implementato in HashMap.

    Queste finezze però alla fine non interessano più di tanto. L'oggetto è realmente un LinkedHashMap quindi nella sua interezza il comportamento è quello di LinkedHashMap. Che rispetto a HashMap ha solo in più la capacità di poter garantire un insertion-order o al limite un access-order. E questo lo puoi sfruttare anche "vedendo" l'oggetto come HashMap, perché non è una questione di metodo in più o no ma di "comportamento".
    Grazie mille tutto chiaro grazie ancora per la buona spiegazione .

    Alla prossima

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.