Visualizzazione dei risultati da 1 a 9 su 9

Discussione: HashMap e LinkedHasMap

  1. #1

    HashMap e LinkedHasMap

    Ciao Ragazzi,
    Avrei una domanda da farvi. Ci sta un WebService che in risposta ha un oggetto che contiene un HashMap e un intero. L’Hashmap che devo fornirgli contiene una serie di nomi che dovrebbe stamparli in base all’inserimento che faccio.
    Ovviamente l’HashMap ha un comportamento diverso; stampa i valori in maniera randomica. A questo punto nel set dell’Hashmap passo un LinkedHashMap che stampa i valori nell’ordine in cui vengono inseriti.
    La mia Domanda è questa:
    Perché se passo un LinkedHasMap nel set di un HashMap quando scorro l’HashMap i valori al suo interno vengono stampati nell’ordine in cui sono stati inseriti?
    Il WebService alla fine usa un HashMap non un LinkedHashMap . . . spero che abbiate capito la mia domanda J

    Grazie mille

  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
    Perché se passo un LinkedHasMap nel set di un HashMap quando scorro l’HashMap i valori al suo interno vengono stampati nell’ordine in cui sono stati inseriti?
    Il WebService alla fine usa un HashMap non un LinkedHashMap . . . spero che abbiate capito la mia domanda J
    LinkedHashMap estende HashMap. Quindi ovunque in Java ci sia una variabile/parametro che si aspetta un HashMap, è lecito passare un LinkedHashMap.

    LinkedHasMap ha anche una lista linkata e mantiene il "insertion-order" oppure (se costruito con l'apposito costruttore) il "access-order".
    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
    LinkedHashMap estende HashMap. Quindi ovunque in Java ci sia una variabile/parametro che si aspetta un HashMap, è lecito passare un LinkedHashMap.

    LinkedHasMap ha anche una lista linkata e mantiene il "insertion-order" oppure (se costruito con l'apposito costruttore) il "access-order".

    Ciaon andbin,
    Grazie della risposta. Che LinkedHashmap estende Hasmap mi torna. Ti posto un esempio:

    Codice PHP:
    import java.util.HashMap;import java.util.LinkedHashMap;import java.util.Set;
    public class 
    Test2 {    public static void main(String[]args){                HashMap<StringStringmaps = new HashMap<StringString>();                for(int i 010i++){            maps.put("name: "+i"value: " +i);        }                        Test3 t = new Test3();        t.setMaps(maps);                Set<Stringt.getMaps().keySet();        for(String s b){            System.out.println("value: " +t.getMaps().get(s));        }                                LinkedHashMap<StringStringlinked = new LinkedHashMap<StringString>();                for(int i 010i++){            linked.put("name: "+i"value: " +i);        }                        Test3 t2 = new Test3();        t2.setMaps(linked);                        Set<Stringb2 t2.getMaps().keySet();        for(String s b2){            System.out.println("value 2: " +t2.getMaps().get(s));        }                    }    }

    class 
    Test3{        private HashMap<StringStringmaps;
        public 
    HashMap<StringStringgetMaps() {        return maps;    }
        public 
    void setMaps(HashMap<StringStringmaps) {        this.maps maps;    }} 

    Allora nel primo for stampa in maniera randomica, nel secondo for stampa in maniera ordinata (in base all'inserimento che faccio io).

    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?

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

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

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

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

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

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