HashMap问题:填充后条目丢失

HashMap Problem: Entries missing after filling

您好,感谢您的阅读。 Java 中的 Hashmap 有问题。 HashMap 被认为可以替代二维数组,从而使用数组索引对来计算键。映射在双 for 循环中填充。相关代码片段如下所示。

这里是地图的“填充”和后续的尺寸测试。

   HashMap<Integer, Cell> field = new HashMap<Integer, Cell>();
    // Fill field object with cells
    for (int colCnt = 0; colCnt < cols; colCnt++) {
      for (int rowCnt = 0; rowCnt < rows; rowCnt++) {
        Cell cell = new Cell(colCnt, rowCnt);
        field.put(cell.hashCode(), cell);
      }
    }
    System.out.println("cells: "+field.size());

这里是Cell对象的构造函数:

 public Cell(int column, int row) {
    if (row < 0 || column < 0) {
      throw new IllegalArgumentException("Cell must not have negative coordinates");
    }
    this.row = row;
    this.column = column;
    this.status = false;
  }

这里是 HashCode 的方法(来自 Cell class):

  public int hashCode() {
    return Objects.hash(column, row);
  }

其中参数 column 和 row 指的是局部最终 int 变量,它们是 class 字段,在构造函数中设置。

问题是: 一旦列参数大于 1 并且(同时)行参数大于 31 并且大于列参数,则不再映射所有单元格。仔细观察,我发现只有最后一列(当 col > 1 时)有完整的行号。除了最后一列之外的所有列都被截断为 31 个元素。 但是,如果列参数比行大得多,一切都很好,例如1000 列和 5 行产生 5000 个单元格。另一方面,5 列和 1000 行仅提供 1124 个单元格。如果列和行同时增加,它会一直工作到 31 列和 31 行导致 961 个单元格。对于 32 列和 32 行,我得到 993 个单元格而不是 1024 个单元格。

谁能给我一些提示,出了什么问题? HashMap ist 设置了默认参数,意味着最初有 16 个字段并加载 0.75.

非常感谢!!

hashCode 不是唯一标识符,因此不能依赖它作为映射键。一个简单的选择是将列和行连接为字符串并使用 Map

public class Cell {
  ... stuff ...
  public String key() {
    return String.format("%d-%d", column, row);
  }
}