java - 集合 - 长类哈希码与整数类哈希码
问题描述
我有下面的代码来检查不同对的总和是否等于一个数字。
static int numberOfPairs(int[] a, long k) {
Integer
Map<Integer,Integer> map = new HashMap<>();
int count =0;
for(int i=0;i<a.length;i++){
for(int j=i+1;j<a.length;j++) {
if(a[i]+a[j] == k){
if((!map.containsKey(a[i])) && (!map.containsKey(k-a[i]))) {
map.put(a[i], a[j]);
count++;
}
}
}
}
return count;
}
containskey 方法不适用于上述代码 bcoz k 的类型为 long。但如果我将 long 转换为 int,则代码有效。
static int numberOfPairs(int[] a, long k) {
Integer
Map<Integer,Integer> map = new HashMap<>();
int count =0;
for(int i=0;i<a.length;i++){
for(int j=i+1;j<a.length;j++) {
if(a[i]+a[j] == k){
int x=(int)k-a[i];
if((!map.containsKey(a[i])) && (!map.containsKey(x))) {
map.put(a[i], a[j]);
count++;
}
}
}
}
return count;
}
Que:为什么它不适用于 long 类型? containsKey 方法是如何工作的?
解决方案
map.containsKey(ka[i])
这是检查 aLong
中是否存在Map<Integer, Integer>
。即使数值恰好相同,这也总是错误的。
请注意,long
需要装箱才能用作 的参数containsKey(Object key)
,但它会自动装箱为Long
,而不是Integer
。
像 Findbugs 这样的静态代码检查器可能会给你一个警告。如果泛型更早地进入 Java,这甚至可能是您想要的编译时错误。
map.containsKey((int)(ka[i]))
现在你有一个int
,它将自动装箱为 anInteger
并且它可以工作。
推荐阅读
- linux - 如何以编程方式在 Web 服务器上启动 cron 服务?
- reactjs - 使用自定义“App”在 Next.js 中保留导航栏
- python - 使用 yolo 自定义损失函数训练神经网络的损失等于 nan?
- sql - 将 varchar 值 '' 转换为数据类型 Bit 时转换失败
- java - Java 正则表达式:模式和匹配器
- reactjs - REACTJS 错误:重新渲染太多。React 限制渲染次数以防止无限循环
- python - int分解成加法
- django - 没有名为roocket的模块
- docusignapi - 从一位专用用户发送信封
- java - 春季启动缓慢的jsp加载