Question on HashMap change in 8011200
Remi Forax
forax at univ-mlv.fr
Thu Jun 27 21:13:09 UTC 2013
On 06/27/2013 10:02 AM, Shi Jun Zhang wrote:
> Hi,
>
> There are some isEmpty() check added into get/remove methods since
> 8011200 to return directly if HashMap is empty. However isEmpty is a
> non-final public method which can be overridden by subclass. If the
> subclass defines isEmpty differently from HashMap, it would cause
> problem while getting or removing elements.
yes, it's a bug.
Could you report it ?
Rémi
>
> For example, here is a simple test case, the subclass of HashMap
> always has at least one key value pair so isEmpty will never be false.
>
> ///////////////////////////////////////////////////////////////////////////////
>
>
> import java.util.HashMap;
>
>
> public class HashMapTest {
> public static class NotEmptyHashMap<K,V> extends HashMap<K,V> {
> private K alwaysExistingKey;
> private V alwaysExistingValue;
>
> @Override
> public V get(Object key) {
> if (key == alwaysExistingKey) {
> return alwaysExistingValue;
> }
> return super.get(key);
> }
>
> @Override
> public int size() {
> return super.size() + 1;
> }
>
> @Override
> public boolean isEmpty() {
> return size() == 0;
> }
> }
>
> public static void main(String[] args) {
> NotEmptyHashMap<String, String> map = new NotEmptyHashMap<>();
> map.get("key");
> }
> }
> //////////////////////////////////////////////////////////////////////////
>
>
> The test can end successfully before 8011200 but it will throw
> ArrayIndexOutOfBoundsException after 8011200. The reason is isEmpty()
> check in HashMap.getEntry() method gets passed but the actual table
> length is 0. I think the real intention of isEmpty() check is to check
> whether size in HashMap is 0 but not whether the subclass is empty, so
> I suggest to use "size == 0" instead of "isEmpty()" in get/remove
> methods.
>
> Do you think this is a bug or a wrong usage of extending HashMap? I
> find there is a similar usage in javax.swing.MultiUIDefaults which
> extends Hashtable.
>
>
More information about the core-libs-dev
mailing list