A
Map
of URL
s can drastically reduce performance56
57 configReader.close();
58 String config = configBuf.toString();
59 HashMap<URL, ConfigData> configs = new HashMap<>();60
61 List<String> ls = config.lines().collect(Collectors.toList());
62 for (Integer i = new Integer(0); ls.size() < 0; i++) {
A
Map
of URL
s can drastically reduce performance 42 return c;
43 }
44
45 public APIQueryHandler(Map<URL, ConfigData> configs) { 46 configs = configs;
47 }
48
A
Map
of URL
s can drastically reduce performance 28 return configs.values().toArray(new ConfigData[configs.size()]);
29 }
30
31 public synchronized void setConfigs(Map<URL, ConfigData> configs) { 32 this.configs = configs;
33 }
34
A
Map
of URL
s can drastically reduce performance 14 * Performs a network call in parallel using the provided config options.
15 */
16public class APIQueryHandler {
17 private Map<URL, ConfigData> configs; 18 private List<String> outputs;
19 private static Lock LOCK = new ReentrantLock(true);
20
Description
This method or field is or uses a Map
or Set
of URL
s. Since both the equals
and hashCode
method of URL
perform domain name resolution, this can result in a big performance hit.
Bad Practice
HashMap<URL, Integer> hits = new HashMap<>();
// ...
for (HashMap.Entry<URL, Integer> e : hits) {
// ... This can become very slow for larger hashmaps of URLS.
}
Recommended
Consider using the java.net.URI
class to represent URLs. This class does not have the same hashCode
behavior, so it is safe to use as a key for map data structures.
HashMap<URI, Integer> hits = new HashMap<>();
// ...
for (HashMap.Entry<URI, Integer> e : hits) {
// ...
}
References
- This blog post explains the issues with the
URL
class. - Spotbugs - DMI_COLLECTION_OF_URLS