考虑以下:
HashMap<String, Object> hm = new HashMap<>();
final String prefix = "My objects ";
int counter = 0;
void put(Object value) {
hm.put(prefix+(counter++), value);
}
假设每个条目的键都以相同的字符串开头,并且仅相差一个附加的数字,这是否可能导致更多的冲突?从性能的角度来看,我试图确定这种创建唯一密钥的方法是否是一个好主意。
不,不会。那 不一定 是因为String#hashcode
; 但是因为a
HashMap
会通过对最后16个16位进行XOR运算来重新哈希您的哈希码。
// this is re-hashing that is done internally
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
但是,即使那 会 增加碰撞,您也可能永远不会感觉到。对于将条目逐个放置(以链接的方式)的小桶/箱,equals
将被调用以获取您关心的 实际
条目。
如果某个仓位/存储桶达到某个阈值,它将被转换为perfectly balanced tree node
。这样的树中的搜索时间为0(logn)
。
即使 相同的条目在重新哈希 后 报告了相同的哈希码,如果出现平局,地图也必须决定哪个条目 较大 。
然后Comparable#compareTo
,如果您的键实现了Comparable
,它将尝试调用。如果他们不执行Comparable
,System.identityHashcode
将在平局的情况下决定。
从性能角度来说,由于所有这些内部因素,您的平均搜索时间将O(1)
在地图中。
问题内容: 在放入HashMap期间发生冲突时,是否会调整地图大小或将条目添加到该特定存储桶中的列表中? 问题答案: 当您说“冲突”时,您是指相同的哈希码吗?哈希码用于确定要使用HashMap中的哪个存储桶,并且该存储桶由具有相同哈希码的所有条目的链表组成。然后在返回或引导(获取/放入)之前比较条目的相等性(使用.equals())。 请注意,这是专门用于HashMap的(因为这是您所要求的),而
问题内容: 快速的问题,我已经尝试自己弄清楚这一点,但是在试图弄清页面为什么或如何重新加载以及正在/不应该执行其应做的工作时,使用会话变量可能会造成混淆。 在任何(非脚本)情况下,页面重新加载(使用JavaScript,f5,ctrl + f5,浏览器重新加载按钮等)是否会导致表单重新发布? (这与在C#代码中使用IfPost分支有关,例如下面的示例代码): 我只是需要知道在这里期望什么,以便可以
问题内容: 我试图说服自己,该子句中采取的操作在函数返回 之前发生 (从内存一致性的角度来看)。从JVM规范,很显然,在一个线程中,程序顺序应该是驱动 之前发生 关系-如果 一个 发生 b 按照程序顺序,然后 一 前发生 b 。 但是,我没有看到任何明确说明最终 会在 返回 之前发生的 东西,是吗?或者,编译器是否可以通过某种方式对子句进行重新排序,因为它只是在记录日志。 激励示例:我有一个线程从
问题内容: 看到各种与锁定相关的问题,并且(几乎)总是发现“由于虚假唤醒而引起的循环” 1我想知道,有人经历过这种唤醒(例如,假设硬件/软件环境不错)吗? 我知道“虚假”一词没有明显的原因,但是发生此类事件的原因可能是什么? (1注意:我不是在问循环练习。) 编辑:一个帮助器问题(对于那些喜欢代码示例的人): 如果我有以下程序,并且运行它: 我该怎么做才能虚假地唤醒它,而不必永远等待随机事件? 问
问题内容: 我正在编写一个测试程序,如下所示: 当用户单击按钮A时,它将打开50个JFrame。 当用户单击按钮B时,它将放置所有通过单击按钮A显示的JFrame。 我发现单击按钮B后内存不会减少。我使用任务管理器(在Windows中为+ + ,并检查“ java”的内存使用情况)确定了这一点。 问题答案: 是的,没有办法,无法解决(不仅在Java PL中), 1)实际上,不要在运行时/运行时创建
嗨,一个星期以来,我一直在追踪我的办公代码中的一个错误。它与Spring、Hibernate和Transaction有关。 我所知道的: 1.延迟加载。 2. Spring如何使用代理和拦截器进行事务管理。 3. Spring中的事务传播,我们的代码使用默认的REQUIRED。 4.每个请求/会话的会话和Hibernate的分离实体基础来保持会话,以及我们的会话不是每个会话的事实。 我的场景:我的