繁体   English   中英

Java中哈希码的延迟初始化

Lazy initialization of hashcode in Java

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

为什么我们说不可变对象使用惰性哈希码初始化? 对于可变对象,也只能在需要时才导致哈希初始化而计算哈希码?

2 个回复

对于可变类,存储hashCode通常没有多大意义,因为每次修改对象时都必须对其进行更新(或至少将其无效,以便您下次调用hashCode()时可以重新计算它) 。

对于不可变类,存储哈希码非常有意义-一旦计算出哈希码,它就永远不会改变(因为对象是不可变的),并且每次调用hashCode()都无需继续重新计算。 作为进一步的优化,我们可以避免在第一次需要该值之前(即,调用hashCode()来计算该值-即使用延迟初始化。

没有什么可以阻止您对可变对象执行相同的操作,通常这不是一个好主意。

延迟初始化的优点是,哈希码计算将被挂起,直到需要它为止。 许多对象根本不需要它,因此您可以节省一些计算。 特别是当您具有较高的哈希计算量时。 看下面的例子:

 class FinalObject { private final int a, b; public FinalObject(int value1, int value2) { a = value1; b = value2; } // not calculated at the beginning - lazy once required private int hashCode; @Override public int hashCode() { int h = hashCode; // read if (h == 0) { h = a + b; // calculation hashCode = h; // write } return h; // return local variable instead of second read } } 

1 延迟Java初始化直到需要

我有一个网页,有时我需要与设备通信。 使用套接字访问此设备,因此我有一个带有支持库的jar文件。 当你想从设备获取数据时,你按一个按钮,javascript方法使用库获取数据(这里没有java代码) jar的存在使得java机器在加载页面后立即启动。 由于有很多用户不使用此选 ...

2 在 C 中初始化哈希表?

我正在为我的 C 课做一些家庭作业,但我不知道如何解决这个问题。 我被告知“从堆中分配一个带有 htsize 存储桶的哈希表,每个存储桶最初都是空的。” 我已经通过命令行参数指定了 htsize,并在以下代码中将其设为全局变量: 但我不确定“从堆中分配”意味着什么。 有人可以帮我分解一下吗? ...

3 在Ruby中初始化哈希的问题

我有一个文本文件,我想从中创建一个哈希以加快访问速度。 我的文本文件的格式(以空格分隔) 我想创建一个散列,其中作者是键,其余是作为数组的值。 提前致谢。 ...

2010-06-09 21:52:08 2 237   ruby
4 在Spring Map中延迟初始化bean

我试图在Spring映射中延迟初始化bean,以便仅在通过map.get检索它们时初始化内部的bean。 考虑以下代码: 春季配置 : 测试类别 : 如果运行上面的代码,则在应用程序启动时将初始化映射中的Messager bean。 我如何推迟bean的初始化,直到检索 ...

6 JavaFX中的属性的延迟初始化

似乎属性的惰性初始化是JavaFX中的常见设计模式。 例如, OpenJFX Labeled实现包含以下代码段: 假定可以从JavaFX UI线程以及其他潜在的客户端线程访问该属性,并且此实现不是线程安全的 ,这似乎是一个错误。 考虑到使用该模式的频率,这可能是一个非常严重的问题,或 ...

7 .NET 4中的延迟初始化

什么是延迟初始化。 这是我搜索谷歌后得到的代码。 我为什么要以这种方式创建对象....实际上我们需要以这种方式创建对象......寻找答案。 ...

8 Java接口静态字段延迟初始化

给定的例子 在 JDK8 和 JDK10 上都只打印"Class field" 。 直接访问Aa产生其初始化和"Interface field"输出。 这表明接口静态字段初始化是惰性的,这对于最终静态类字段而言并非如此。 我可以看到OpenJDK JEP 草案关于类的这种懒惰,但它是接口的记 ...

9 Java非延迟初始化非静态方法?

我最近爱上了懒惰加载技术,使用如下: 但对于非静态方法,类似的技术也是可行的吗? 例 问题是以上是不可能的,因为ComplexClassHolder和ComplexClassHolder.r不是静态的。 如果我将它们设为静态,我无法访问SomeClass.this.see ...

暂无
暂无

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

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