Files
codeql/java/ql/src/Performance/InefficientKeySetIterator.qhelp
Marcono1234 e21cbe82a9 Update Java documentation links to Java 11
Where possible update Java documentation links to Java 11.
Additionally update some other links to use HTTPS.
2021-02-26 00:43:51 +01:00

48 lines
1.6 KiB
XML

<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<overview>
<p>Java's Collections Framework provides several different ways of iterating
the contents of a map. You can retrieve the set of keys, the collection of values, or the
set of "entries" (which are, in effect, key/value pairs).</p>
<p>The choice of iterator can affect performance. For example, it is considered bad practice to iterate
the key set of a map if the body of the loop performs a map lookup on each retrieved key
anyway.</p>
</overview>
<recommendation>
<p>Evaluate the requirements of the loop body. If it does not actually need the key
apart from looking it up in the map, iterate the map's values (obtained by a call to
<code>values</code>) instead. If the loop genuinely needs both key and value for
each mapping in the map, iterate the entry set (obtained by a call to
<code>entrySet</code>) and retrieve the key and value from each entry. This saves a
more expensive map lookup each time.</p>
</recommendation>
<example>
<p>In the following example, the first version of the method <code>findId</code> iterates
the map <code>people</code> using the key set. This is inefficient because the body of the loop
needs to access the value for each key. In contrast, the second version iterates the map
using the entry set because the loop body needs both the key and the value for each mapping.</p>
<sample src="InefficientKeySetIterator.java" />
</example>
<references>
<li>
Java API Specification:
<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Map.html#entrySet()">Map.entrySet()</a>.
</li>
</references>
</qhelp>