HashMap源码为何多用中间变量?

发布于 2022-09-11 15:54:30 字数 572 浏览 20 评论 0

拿HashMap的keySet()方法举例:

    public Set<K> keySet() {
        Set<K> ks = keySet;
        if (ks == null) {
            ks = new KeySet();
            keySet = ks;
        }
        return ks;
    }

写成如下形式岂不是更简洁?

    public Set<K> keySet() {
        if(keySet == null) {
            keySet = new KeySet();
        }
        return keySet;
    }
    public Set<K> keySet() {
       return keySet == null ? (keyset = new KeySet()) : keySet;
    }

作者有其他用意吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

唱一曲作罢 2022-09-18 15:54:30

可以勉强看做是作者的变量就近定义风格吧。把类成员变量或方法参数改为局部变量,在你这个小例子中可能显得有点多余,但这个习惯也有多个好处:

1.更简洁清晰,局部变量可以使用缩写也很容易理解,成员变量没有人提倡用缩写;
2.可以按变量实际用途重新准确命名;
3.便于重构,如提取成方法等;
4.减少副作用,如意外修改成员变量等;
5.多几行代码单步调试时更容易观察变量;
6.更容易被优化.

个人见解,仅供参考。

沒落の蓅哖 2022-09-18 15:54:30

http://hg.openjdk.java.net/jd...

你看的是什么年代的源码?jdk8的源码中就已经改成你写的那种形式了。

蒲公英的约定 2022-09-18 15:54:30

这个跟 keySet 被 volatile 修饰有关。

1 本地变量可以防止共享变量被意外修改。
2 使用本地变量可以减少对 volatile 变量的读取次数,JVM 可以优化代码的执行。

可以参考这个 https://stackoverflow.com/que...

如果不考虑 volatile,应该就是为了防止判过 keySet 空之后,别的线程把 keySet 设置成 null,结果返回了 null。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文