简体   繁体   English

jre1.6.0_27 HashMap values()源代码

[英]jre1.6.0_27 HashMap values() sourcecode

Today, I opened jre1.6.0_27 HashMap values() method sourcecode 今天,我打开了jre1.6.0_27 HashMap values()方法源代码

  389  public Set<K> keySet()
  390  {
  391      Set localSet = this.keySet;
  392      return (this.keySet = new KeySet(null));
  393  }
  394
  395  public Collection<V> values()
  396  {
  397      Collection localCollection = this.values;
  398      return (this.values = new Values(null));
  399  }

I think these sourcecode are error, but I don't know why they look like this. 我认为这些源代码是错误的,但我不知道为什么它们看起来像这样。 Who can tell me why? 谁能告诉我为什么?

======================================= ======================================

Thanks everyone, I think this is Eclipse problem, this sourcecode I used Eclipse F3 and went to it, so it looks like the above that. 谢谢大家,我认为这是Eclipse问题,我使用Eclipse F3并转到了此源代码,因此它看起来像上面的代码。

I just open src.zip, this method sourcecode is right. 我只是打开src.zip,此方法的源代码是正确的。

/**
 * Returns a {@link Collection} view of the values contained in this map.
 * The collection is backed by the map, so changes to the map are
 * reflected in the collection, and vice-versa.  If the map is
 * modified while an iteration over the collection is in progress
 * (except through the iterator's own <tt>remove</tt> operation),
 * the results of the iteration are undefined.  The collection
 * supports element removal, which removes the corresponding
 * mapping from the map, via the <tt>Iterator.remove</tt>,
 * <tt>Collection.remove</tt>, <tt>removeAll</tt>,
 * <tt>retainAll</tt> and <tt>clear</tt> operations.  It does not
 * support the <tt>add</tt> or <tt>addAll</tt> operations.
 */
903    public Collection<V> values() {
904        Collection<V> vs = values;
905        return (vs != null ? vs : (values = new Values()));
906    }

At least in OpenJDK 7 it looks correct: 至少在OpenJDK 7中看起来是正确的:

  880       public Set<K> keySet() {
  881           Set<K> ks = keySet;
  882           return (ks != null ? ks : (keySet = new KeySet()));
  883       }

  916       public Collection<V> values() {
  917           Collection<V> vs = values;
  918           return (vs != null ? vs : (values = new Values()));
  919       }

Why do you think these methods are wrong? 您为什么认为这些方法是错误的? You have to look at the source code of the inner classes KeySet and Values inside HashMap to understand how these work. 您必须查看HashMap内部类KeySetValues的源代码才能了解它们的工作原理。

The keySet() method returns a new KeySet object. 所述keySet()方法返回一个新的KeySet的对象。 In JDK 1.6.0_35, the source code of the inner class KeySet looks like this: 在JDK 1.6.0_35中,内部类KeySet的源代码如下所示:

private final class KeySet extends AbstractSet<K> {
    public Iterator<K> iterator() {
        return newKeyIterator();
    }
    public int size() {
        return size;
    }
    public boolean contains(Object o) {
        return containsKey(o);
    }
    public boolean remove(Object o) {
        return HashMap.this.removeEntryForKey(o) != null;
    }
    public void clear() {
        HashMap.this.clear();
    }
}

It's an implementation of Set that gets its data from the HashMap . 它的实现Set从获取数据HashMap

Likewise there's an inner class Values that works in the same way. 同样有一个内部类Values ,在相同的方式工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM