为什么 Java String 哈希码会延迟生成?

发布于 2025-01-06 05:18:40 字数 354 浏览 0 评论 0原文

在java.lang.String.java中,Java只会在调用hashcode()后生成hashcode,然后存储它,但为什么不在构造函数中直接生成hashcode呢?

相关代码:

if (h == 0 && count > 0) {
    int off = offset;
    char val[] = value;
    int len = count;

    for (int i = 0; i < len; i++) {
        h = 31*h + val[off++];
    }

    hash = h;
}

大部分可以放在构造函数中。

It appears in java.lang.String.java, that Java will only generate the hashcode, and then store it, after a call to hashcode(), but why not just make the hashcode in the constructor?

The relevant code:

if (h == 0 && count > 0) {
    int off = offset;
    char val[] = value;
    int len = count;

    for (int i = 0; i < len; i++) {
        h = 31*h + val[off++];
    }

    hash = h;
}

could for the most part be placed in the constructor.

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

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

发布评论

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

评论(5

像极了他 2025-01-13 05:18:40

为什么要花时间生成一个很可能不会被使用的哈希码?大多数字符串都是在不调用 hashcode() 的情况下构造、使用和垃圾回收的。

Why spend time generating a hash code that most likely will not be used? Most strings are constructed, used and then garbage collected without the hashcode() ever being called.

标点 2025-01-13 05:18:40

约书亚·布洛赫 (Joshua Bloch) 将这种做法称为“活泼的单一检查”。

Jeremy Manson 对为什么这样做以及为什么它是安全的有很好的解释:在他的博客上

本质上,在构建时,您可以通过跳过计算哈希码来节省一些时间。在多线程环境中,您将为此付出代价,因为多个线程可能会执行相同的计算。

Joshua Bloch call this practice 'racy single-check'.

Jeremy Manson has excellent explanation of why it's done and why it'safe: on his blog

In essence, at construction time you save some time by skipping calculating hash code. In multithreaded environment you'll pay for this back because multiple thread potentially could do the same calculation.

[旋木] 2025-01-13 05:18:40

这实际上并不是正确的论坛,问题可能会被关闭。您可以尝试在programmers.stackexchange.com 中询问。

原因之一可能是计算 hashCode 并不便宜,并且仅在某些情况下才需要。

This is not really the correct forum for this and the question will likely be closed. You can try asking in programmers.stackexchange.com.

One reason could be that computing hashCode is not cheap and it is required only in some cases.

好倦 2025-01-13 05:18:40

2 个原因:

1) 计算 hashCode() 并不便宜:字符串长度的复杂度为 O(n),因此最好只在需要时才执行。

并且:

2) String 实例是不可变的:因为它们永远不会改变,所以您最多总是计算一次 hashCode()

2 reasons:

1) Computing hashCode() is not cheap: is an O(n) complexity on the string's length, so better do it only when need it.

and:

2) String instances are immutable: Since they never change, you always compute hashCode() at most one time.

一人独醉 2025-01-13 05:18:40

将其放入构造函数中没有任何好处。但是当它在构造函数中时有一个缺点。当字符串的 hashCode 从未被调用时,计算就白费了。当您调用 hashCode() 时,两种情况都会计算一次 - 只是在不同的地点和时间。

There is no benefit when placing it in the constructor. But there's a downside when it would be in the constructor. When hashCode for a String is never called then computation was done for nothing. And when you call hashCode() then it is calculated once in both cases - just in different places and time.

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