- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
java.util.HashMap
有一个 put 方法的实现,它有 the following code inside it :
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
在上面的代码中,为什么不首先进行引用检查(因为具有相同引用的两个对象将具有相同的散列和 equals())?
即像这样:
if ((k = e.key) == key) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
} else if ( compare hash and equals) {
// do something again with the value
}
这不会保存比较吗?
最佳答案
我不知道为什么,但一个简单的微基准测试表明,在 Oracle 的 VM(英特尔,32 位或 64 位)上,比较两个引用所花的时间大约是比较两个整数(如哈希码)的四倍。我本以为比较两个 32 位整数和两个地址指针在现代硬件上应该具有相似的运行时成本,但我可能只是没有考虑这里明显的事情。
假设在大多数情况下不同的 key 具有不同的哈希码,比较 key 之前的哈希可以为每个错误的 key 节省 75% 的运行时间,并为正确的 key 增加 25% 的运行时间。这是否真的节省了总体运行时间当然取决于 HashMap 表的确切内容和布局,但 Sun 工程师显然认为这种变体对于大多数用途来说更好。
用于基准测试的方法:
public static int c1(int a, int b, int iter) {
int r = 0;
while((iter--)>0) {
if(a == b) {
r++;
}
}
return r;
}
public static int c2(Object a, Object b, int iter) {
int r = 0;
while((iter--)>0) {
if(a == b) {
r++;
}
}
return r;
}
关于Java HashMap put() 实现。为什么不先检查引用文献?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24243092/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我对描述 PHP 内部工作原理、陷阱和一些高级功能的文献(互联网上的文章、杂志、书籍、播客 - 我真的不介意任何东西)很感兴趣。那里有这样的东西吗?我试着在谷歌上搜索,但大多数文章都是关于从 PHP
我知道这个问题的答案是否可能是主观的,(而且我还没有找到类似的问题)但我的问题如下: 我在互联网/文献上看到过不同来源的代码片段,其中一个来 self 项目中的队友。通常他们中的一些人会采用类似...
我是一名优秀的程序员,十分优秀!