为什么此循环之一不适用于递增哈希 table?

Why does one of this loop not work for incrementing a hash table?

所以我有两个循环。他们在哈希表上使用一个键。如果该键中没有任何内容,则存储 1。如果有内容,则存储加 1。

   for(int i=0; i<nums1.length; i++) {
        Integer count = nums_hash.get(i);
            if (count == null) {
               nums_hash.put(nums1[i], 1);
            }
            else {
               nums_hash.put(nums1[i], count+1);
             }
      }

第一个不起作用,但下面的工作得很好:

      for(int i = 0; i < nums1.length; i++)
        {
            if(nums_hash.containsKey(nums1[i])) {
               nums_hash.put(nums1[i],nums_hash.get(nums1[i])+1);
               }

            else nums_hash.put(nums1[i], 1);
       }

我想了解一下这个的解释。

你的第二行代码应该是

Integer count = nums_hash.get(nums1[i]);

您没有在整个代码中使用同一个密钥。避免这种情况的一个好方法是不要像您那样重复评估它。例如

Integer key = nums1[i];

为了避免不正确的代码重复,编写此代码的一种更简洁的方法是使用 for-each 循环和 Map.compute

for(Integer i : nums1)
  nums_hash.compute(i, (k, v) -> v == null ? 1 : v + 1);

注意:对于线程安全的映射,使用计算是线程安全的。

第一个不起作用,因为您没有将 nums[i] 的值传递给 get 方法,而是传递了 i 的值。将第一个代码的第二行改为

Integer count = nums_hash.get(nums[i]);