Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在每次插入值时不计算哈希代码_Java_Algorithm_Hashmap - Fatal编程技术网

Java 如何在每次插入值时不计算哈希代码

Java 如何在每次插入值时不计算哈希代码,java,algorithm,hashmap,Java,Algorithm,Hashmap,为了便于学习,我实现了自己的hashmap。键有一个字符串,值有一个我创建的类的对象。顺便说一下,我想知道我的hashcode方法是否合适,以及如何避免每次插入值时都计算hashcode 我将哈希值保存为object的成员变量。但是,当调用get方法时,只接收键值,因此必须获取hashcode。如何回收一次计算的哈希值 最后,我的哈希生成方法合适吗 class-IHashMap{ 私有类节点{ 整数散列; 字符串键; int数据; 节点权; 公共节点(字符串键,int数据){ this.ke

为了便于学习,我实现了自己的hashmap。键有一个字符串,值有一个我创建的类的对象。顺便说一下,我想知道我的hashcode方法是否合适,以及如何避免每次插入值时都计算hashcode

我将哈希值保存为object的成员变量。但是,当调用get方法时,只接收键值,因此必须获取hashcode。如何回收一次计算的哈希值

  • 最后,我的哈希生成方法合适吗
class-IHashMap{
私有类节点{
整数散列;
字符串键;
int数据;
节点权;
公共节点(字符串键,int数据){
this.key=key;
这个数据=数据;
this.right=null;
this.hash=0;
}
}
私有节点[]表;
私家车;
私人int n;
公共IHashMap(内部tbSize){
this.table=新节点[tbSize];
this.tbSize=tbSize;
这个。n=0;
}
//…省略不相关的代码。。。
公共void put(字符串键,int值){
int hash=hashCode(key);
节点=新节点(键、值);
node.hash=散列;
if(this.table[hash]!=null){
Node entry=this.table[hash];
while(entry.right!=null&&!entry.key.equals(key))
entry=entry.right;
if(entry.key.equals(key)){
entry.data++;
}
否则{
entry.right=节点;
这个.n++;
}
}
否则{
this.table[hash]=节点;
这个.n++;
}
}
公共int get(字符串键){
int hash=hashCode(key);
if(this.table[hash]!=null){
if(this.table[hash].key.equals(key))
返回此.table[hash].data;
Node entry=this.table[hash];
while(entry!=null&&!entry.key.equals(key))
entry=entry.right;
if(条目==null)
返回-1;
返回输入数据;
}
返回-1;
}
私有整数散列(字符串键){
int h=0;
如果(key.length()>0){
char[]var=strotchararray(键);
对于(int i=0;i

如果您能回答我,我将不胜感激。

因此,hashcode就是所插入内容的hashcode

他们认为避免这一问题的方法是在存储项的哈希代码中插入行,如下所示

int hashcode(){ if(我有一个缓存的hashcode){ 返回缓存的哈希代码; } (计算哈希代码) cached_hashcode=hashcode; 返回哈希码; }

这样,对于每个对象,您只需执行一次hashcode计算

现在,请记住,计算机已经进步了很多。它们主要等待RAM子系统对结果做出响应,并且可以为单个RAM获取执行大约1000到10000个数学操作。这意味着以内存查找为代价的“保留CPU周期”实际上会降低程序的速度

明智地进行基准测试,如果这意味着减少RAM占用,不要害怕使用一点CPU

对于那些好奇的人来说,如果你的程序足够小,可以放入第1层缓存中,这并不是一个很大的延迟,但是当你将这些缓存溢出到其他层中时,延迟就会变得明显。这就是为什么“缓存”并不总是一个很好的解决方案,因为如果缓存过多,程序会变得更大,并且会更频繁地溢出缓存

现代CPU试图进行补偿,主要是通过在请求之前预取所需的RAM(在处理流中向前看)。在许多情况下,这会带来更好的运行时,但也会产生新的问题(比如预加载您可能不使用的东西,因为您选择了代码中的“其他”路径)


最好的办法是不要过度缓存简单的东西,除非重构成本很高。对于JVM,方法调用(在非常低的级别)比您想象的要昂贵,因此JVM对字符串及其哈希代码进行了特殊的优化。

因此,哈希代码是插入内容的哈希代码

他们认为避免这一问题的方法是在存储项的哈希代码中插入行,如下所示

int hashcode(){ if(我有一个缓存的hashcode){ 返回缓存的哈希代码; } (计算哈希代码) cached_hashcode=hashcode; 返回哈希码; }

这样,对于每个对象,您只需执行一次hashcode计算

现在,请记住,计算机已经进步了很多。它们主要等待RAM子系统对结果做出响应,并且可以为单个RAM获取执行大约1000到10000个数学操作。这意味着以内存查找为代价的“保留CPU周期”实际上会降低程序的速度

明智地进行基准测试,如果这意味着减少RAM占用,不要害怕使用一点CPU

对于那些好奇的人来说,如果你的程序足够小,可以放入第1层缓存中,这并不是一个很大的延迟,但是当你将这些缓存溢出到其他层中时,延迟就会变得明显。这就是为什么“缓存”并不总是一个很好的解决方案,因为如果缓存过多,程序会变得更大,并且会更频繁地溢出缓存

现代CPU试图进行补偿,主要是通过在请求之前预取所需的RAM(在处理流中向前看)。在许多情况下,这会带来更好的运行时,但也会产生新的问题(比如预加载您可能不使用的东西)