Ich habe eine Warnung erhalten, dass ich "entrySet ()" in Findbugs verwenden kann, auch wenn Code nur Schlüssel wie ↓ verwendet.
for(var key : map.keySet()){
// map.get(key)Verarbeitung, bei der nur der Schlüssel verwendet wird, ohne dass etwas unternommen wird
}
Ich habe interpretiert, dass "entrySet ()" effizienter ist, wenn sowohl Schlüssel als auch Wert ** verwendet werden. Wenn also nur einer verwendet wird, hängt dies nicht mit der Effizienz zusammen? Da "Eintrag <K, V>" sowohl Schlüssel als auch Wert hat, denke ich, dass eine der unnötigen Ressourcen verschwendet wird, und werde mich daher mit der internen Implementierung für den Trade-In befassen.
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();
//Abkürzung
};
}
};
keySet = ks;
}
return ks;
}
Wenn kein keySet vorhanden ist, wird es erstellt und im Feld gespeichert. Es ist jedoch ersichtlich, dass "entrySet (). Iterator ()" aufgerufen wird, um "Iterator
Mit anderen Worten, die Warnung, dass Sie "entrySet ()" verwenden sollten, um das Denken zu beenden, selbst wenn Sie nur einen der Schlüssel oder Werte haben, war ** richtig **.
Recommended Posts