java中Long和Integer在hashmap判断key是否存在的问题

1、HashMap中是否存在key的判断方法如下,归根结底是判断key的hashcode方法:

public boolean containsKey(Object key) {
    return getEntry(key) != null;
}

final Entry<K,V> getEntry(Object key) {
    if (size == 0) {
        return null;
    }

    int hash = (key == null) ? 0 : hash(key);
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash &&
            ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    }
    return null;
}

final int hash(Object k) {
    int h = hashSeed;
    if (0 != h && k instanceof String) {
        return sun.misc.Hashing.stringHash32((String) k);
    }

    h ^= k.hashCode();

    // This function ensures that hashCodes that differ only by
    // constant multiples at each bit position have a bounded
    // number of collisions (approximately 8 at default load factor).
    h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
}

2、而Long和Integer的hashcode方法分别如下:

Long:

public int hashCode() {
    return (int)(value ^ (value >>> 32));
}

Integer:

public int hashCode() {
    return value;
}

3、问题来了,

当hashmap的key为Long时,用数值a相等的Integer去判断a这个数值可以是否在hashmap中(containsKey),

结果是false;


4、解决方法:

4-1:将Integer强制转换成Long。

4-2:思考中。。。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Redis的Hashes类型来存储这个Map<Long, Map<Integer, Integer>>。Hashes类型可以将多个key-value存储在同一个Redis键下,非常适合存储类似于Map的数据结构。 以下是Java代码示例: ```java // 导入Redis客户端依赖 import redis.clients.jedis.Jedis; // 创建Redis客户端连接,这里使用本地默认端口号6379 Jedis jedis = new Jedis("localhost", 6379); // 定义需要存储的Map Map<Long, Map<Integer, Integer>> map = new HashMap<>(); map.put(1L, new HashMap<Integer, Integer>(){{put(2, 3); put(4, 5);}}); map.put(6L, new HashMap<Integer, Integer>(){{put(7, 8); put(9, 10);}}); // 将Map存储到Redis for (Long key : map.keySet()) { // 构造Redis键 String redisKey = "myHash:" + key.toString(); // 获取当前key对应的Map Map<Integer, Integer> subMap = map.get(key); // 将Map转为Redis Hashes类型的Map Map<String, String> redisSubMap = new HashMap<>(); for (Integer subKey : subMap.keySet()) { redisSubMap.put(subKey.toString(), subMap.get(subKey).toString()); } // 存储到Redis jedis.hmset(redisKey, redisSubMap); } // 从Redis获取Map Map<Long, Map<Integer, Integer>> resultMap = new HashMap<>(); Set<String> keySet = jedis.keys("myHash:*"); for (String redisKey : keySet) { // 解析Redis键key Long key = Long.parseLong(redisKey.split(":")[1]); // 获取Redis存储的Map Map<String, String> redisSubMap = jedis.hgetAll(redisKey); // 将Redis Hashes类型的Map转为Map<Integer, Integer> Map<Integer, Integer> subMap = new HashMap<>(); for (String subKey : redisSubMap.keySet()) { subMap.put(Integer.parseInt(subKey), Integer.parseInt(redisSubMap.get(subKey))); } resultMap.put(key, subMap); } // 打印结果 System.out.println(resultMap); ``` 输出结果: ``` {1={2=3, 4=5}, 6={9=10, 7=8}} ``` 注意事项: - 在存储Map时,需要将Map的每个key-value对应到一个Redis键。这里使用了“myHash:”作为Redis键的前缀,后面接上MapLong类型key。 - 在存储Map时,需要将Map的每个value转为Redis Hashes类型的Map,这里使用了Map<String, String>类型来存储Redis Hashes类型的Map。 - 在从Redis获取Map时,需要遍历所有的Redis键,并将Redis Hashes类型的Map转为Map<Integer, Integer>类型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值