【问题标题】:Why entryset in HashMap calls entryset0?为什么HashMap中的entryset调用entryset0?
【发布时间】:2014-08-16 03:01:47
【问题描述】:

为什么HashMap中的entryset调用entryset0而不是直接写

Set <Map.Entry <K, V >> es = entrySet; 
! return es = null es: (entrySet = new EntrySet ());

writeObject方法中直接调用entrySet0,是不是因为entrySet方法可以被覆盖的原因?

【问题讨论】:

    标签: java hashmap entryset


    【解决方案1】:

    你的解释是最合理的。这是为了将 HashMap 的实现与有人在子类型中覆盖 entrySet() 方法的影响隔离开来。

    我能想到的唯一其他解释是,这是该类的某些旧版本遗留下来的,我不希望 Java 开发人员会在这里发生这种情况。 (这是代码有很多眼球......)

    无论哪种方式,它可能对性能没有影响。 JIT 编译器可能会内联调用 ... 除非存在 HashMap 的子类覆盖 entrySet() 的情况。

    【讨论】:

    • 如果只是覆盖,他们可以将其标记为最终。
    • Ermm ...这将防止覆盖。我/我们的猜测是他们希望允许覆盖该方法,但不会破坏HashMap的内部结构。
    • 呃……我去看看是不是被其他类覆盖了!
    • 我找到了!在ProcessEnvironment 类中,entrySet 方法被覆盖public Set&lt;Map.Entry&lt;String,String&gt;&gt; entrySet() { return new CheckedEntrySet(super.entrySet()); }
    • 已覆盖...未覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多