On Wed, 27 Aug 2025 19:40:28 GMT, Roger Riggs <[email protected]> wrote:
> As observed in [JDK-8366043](https://bugs.openjdk.org/browse/JDK-8366043) > [lworld] (LIFE = Legacy Idiom For Equality) causes performance regressions. > Updating HashMap and ConcurrentHashMap to use `java.util.Objects.equals` will > make it easier to measure performance of options that remove or modify the > use of `==` > > Replace constructs like: > > - ((k = e.key) == key || (key != null && > key.equals(k)))) > with: > + Objects.equals(key, k)) > > > The changes in ConcurrentHashMap are a bit different due to the use of null > as a sentinel. > > The order of arguments to the .equals methods must remain the same to ensure > compatibility. src/java.base/share/classes/java/util/HashMap.java line 2026: > 2024: else if (ph < h) > 2025: p = pr; > 2026: else if (Objects.equals(k, (pk = p.key))) Stylistic: don't need parentheses around `pk = p.key` src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java line 669: > 667: (k = (e = (Map.Entry<?,?>)o).getKey()) != null && > 668: (v = e.getValue()) != null && > 669: (Objects.equals(k, key)) && `k.equals(key)` should be sufficient here. src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java line 682: > 680: K ek; > 681: if (e.hash == h && > 682: (ek = e.key) != null && Objects.equals(k, ek)) Looking at the code in HashMap, I think you can just use `Objects.equals(k, ek = e.key)`, or just `k.equals(ek = e.key)` because `Object::equals` is supposed to return false on null. ------------- PR Review Comment: https://git.openjdk.org/valhalla/pull/1536#discussion_r2305408280 PR Review Comment: https://git.openjdk.org/valhalla/pull/1536#discussion_r2305407382 PR Review Comment: https://git.openjdk.org/valhalla/pull/1536#discussion_r2305411815
