2011-06-10 4 views
4

Il s'agit plus d'une question de curiosité que de tout. Dites que je fournis un LinkedHashMap avec un ordre d'accès défini sur true à Collections.unmodifiableMap(). Puisque les lectures modifient réellement la carte. Cela signifie-t-il qu'il existe des cas où la vue retournée par unmodifiableMap() est réellement modifiable?Collections.unmodifiablemap() et les collections où les lectures modifient également

public class MyApp { 

    /** 
    * @param args 
    */  
    public static void main(String[] args) { 
    Map<String, String> m = new LinkedHashMap<String, 
     String>(16,.75f,true); 
     Collections.unmodifiableMap(m);  

    } 

}

+0

HashMap et LinkedHashMap ont toujours une capacité sous-jacente qui est une puissance de 2. la mise à 15 est la même chose que l'utilisation de 16 qui est la valeur par défaut. Changer le facteur de charge de 0,7 à 0,75 par défaut est peu susceptible de faire une grande différence. –

+1

Je viens de fournir des valeurs aléatoires de pseudo. Bien que je suis sûr que la capacité initiale par défaut est de 16 et le facteur de charge est de 0,75. Bien que ceux-ci sont vraiment sans rapport avec ma question. – nsfyn55

+0

Vous avez raison sur le facteur de charge. ;) –

Répondre

5

La carte est en train de modifier lui-même. Collections.unmodifiableMap() ne fournit qu'un décorateur pour la carte qui interdit les modifications, elle ne rend pas la carte elle-même non modifiable.

+0

bien sûr mais une partie de ce décorateur permet encore des opérations get() qui modifient la carte. Il n'y a rien de spécial à propos de get() et put() qui assure que l'un ou l'autre modifie ou ne modifie pas la carte. Je suppose que ce que je veux dire, c'est que non modi fi catif, en supposant que put() modifie la carte et que get() ne fonctionne pas – nsfyn55

+1

@ nsfyn55: D'accord, il serait techniquement plus correct de dire que le décorateur n'autorise pas appelle des méthodes qui modifieraient la 'Map' selon l'interface' Map'. L'interface 'Map' ne dit rien sur l'ordre, et donc' LinkedHashMap' n'est pas considéré comme "modifié" d'après lui. –

3

Collections.unmodifiableMap renvoie une nouvelle carte qui génère des exceptions lorsque vous tentez de la modifier, à l'aide de la carte existante transmise en tant que collection de sauvegarde. Cela ne change pas la sémantique de la carte existante.

Questions connexes