RFR: 8281631: HashMap copy constructor and putAll can over-allocate table [v21]
liach
duke at openjdk.java.net
Sun Feb 20 19:22:51 UTC 2022
On Sun, 20 Feb 2022 19:08:39 GMT, liach <duke at openjdk.java.net> wrote:
>>> @liach implementations `size()` seems O1, and returns a single int number field, but it actually defers in some Map implementations.
>>
>> @liach for example, in ConcurrentSkipListMap and ConcurrentHashMap, `size()` function is far complicated than reading a field, thus calling it twice meaninglessly is not a wise choice.
>
> Imo you should just remove the `if (expectedSize == 0)` check than using this somewhat ugly trick to avoid calling `size()` twice (the second call is only used for this relatively useless fast-path, especially for the concurrent collections you refer to)
In fact, if we do worry about the performance of adding from maps, calling `map.forEach(this::put);` would be a better alternative both in concurrency (as the concurrent map itself takes charage) and object allocation-wise (no allocation of immutable entry objects), but that belongs to another issue.
-------------
PR: https://git.openjdk.java.net/jdk/pull/7431
More information about the core-libs-dev
mailing list