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 11
12/** Performs a network call in parallel using the provided config options. */
13public class APIQueryHandler {
14 private Map<URL, ConfigData> configs; 15 private List<String> outputs;
16 private static Lock LOCK = new ReentrantLock(true);
17
A
Map
of URL
s can drastically reduce performance 25 return configs.values().toArray(new ConfigData[configs.size()]);
26 }
27
28 public synchronized void setConfigs(Map<URL, ConfigData> configs) { 29 this.configs = configs;
30 }
31
A
Map
of URL
s can drastically reduce performance 39 return c;
40 }
41
42 public APIQueryHandler(Map<URL, ConfigData> configs) { 43 configs = configs;
44 }
45
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