【发布时间】: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方法可以被覆盖的原因?
【问题讨论】:
为什么HashMap中的entryset调用entryset0而不是直接写
Set <Map.Entry <K, V >> es = entrySet;
! return es = null es: (entrySet = new EntrySet ());
writeObject方法中直接调用entrySet0,是不是因为entrySet方法可以被覆盖的原因?
【问题讨论】:
你的解释是最合理的。这是为了将 HashMap 的实现与有人在子类型中覆盖 entrySet() 方法的影响隔离开来。
我能想到的唯一其他解释是,这是该类的某些旧版本遗留下来的,我不希望 Java 开发人员会在这里发生这种情况。 (这是代码有很多眼球......)
无论哪种方式,它可能对性能没有影响。 JIT 编译器可能会内联调用 ... 除非存在 的 HashMap 的子类覆盖 entrySet() 的情况。
【讨论】:
HashMap的内部结构。
ProcessEnvironment 类中,entrySet 方法被覆盖public Set<Map.Entry<String,String>> entrySet() { return new CheckedEntrySet(super.entrySet()); }