[JAVA] Map keySet, les valeurs ne doivent pas être utilisées

J'ai été prévenu que je pourrais utiliser ʻentrySet () `dans findbugs même avec du code qui n'utilise que la clé comme ↓.

for(var key : map.keySet()){
    // map.get(key)Traitement qui n'utilise que la clé sans rien faire
}

J'ai interprété que ʻentrySet () est plus efficace si la clé et la valeur ** sont utilisées, donc si une seule est utilisée, n'est-ce pas lié à l'efficacité? Plutôt, ʻEntry <K, V> a à la fois la clé et la valeur, donc je pense qu'une des ressources inutiles est gaspillée, donc je vais regarder la mise en œuvre interne pour l'échange.

AbstractMap.java


public Set<K> keySet() {
        Set<K> ks = keySet;
        if (ks == null) {
            ks = new AbstractSet<K>() {
                public Iterator<K> iterator() {
                    return new Iterator<K>() {
                        private Iterator<Entry<K,V>> i = entrySet().iterator();
                        
                        //Abréviation

                    };
                }
            };
            keySet = ks;
        }
        return ks;
    }

S'il n'y a pas de keySet, il est créé et stocké dans le champ, mais vous pouvez voir que ʻentrySet (). Iterator () est appelé pour initialiser ʻIterator <K>. Après tout, il semble que keySet () et values () passent par ʻentrySet () `.

En d'autres termes, l'avertissement que vous devez utiliser ʻentrySet () `pour arrêter de penser, même si une seule des clés ou des valeurs, était ** correct **.

Recommended Posts

Map keySet, les valeurs ne doivent pas être utilisées
[Java] Quand var doit être utilisé et quand il ne doit pas être utilisé
Utilisez le modèle de repos Gekitsuyo pour la communication REST
[RubyOnRails] Pour quel type de données active_hash doit-il être utilisé?
Le cas où @Autowired n'a pas pu être utilisé dans JUnit5