Visualizzazione dei risultati da 1 a 9 su 9

Discussione: HashMap e LinkedHasMap

Hybrid View

  1. #1
    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 ?

  2. #2
    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

  3. #3
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.