Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象如何从HashMap获取其密钥?_Java_Hashmap_Key_Containment - Fatal编程技术网

Java 对象如何从HashMap获取其密钥?

Java 对象如何从HashMap获取其密钥?,java,hashmap,key,containment,Java,Hashmap,Key,Containment,假设我有一个用HashMap定义的棋盘 HashMap <Position,Field> chessboard = new HashMap <Position,Field>(); 当我试图为字段对象创建一个类时,我遇到了一个问题:字段应该包含一个位置,因为它是由它定义的。前 class Field { Position pos; int color; void draw(){ // draw Field using pos } } 但是Posi

假设我有一个用HashMap定义的棋盘

HashMap <Position,Field> chessboard = new HashMap <Position,Field>();
当我试图为
字段
对象创建一个类时,我遇到了一个问题:
字段
应该包含一个
位置,因为它是由它定义的。前

class Field {
  Position pos;
  int color;
  void draw(){
    // draw Field using pos
  }
}
但是Position对象将用于HashMap。
如何避免这种冗余?

成本实际上并不是您所想的:您只持有一个指向内存中相同
位置
对象的引用(在大多数系统中为四个字节)。开销最小;甚至不用担心它。

只需将其从
字段中删除即可。您可以从
Map
访问它。您可以将相同的
位置
对象用于
字段
对象和
哈希映射
中的键,除非在
Position
上覆盖
equals
hashCode
,否则HashMap将无法按预期工作。当对象的键是该对象值的一部分时,不应使用映射,而应使用集合。@DavidSchwartz:为什么?通过ISBN或用户ID或其他方式快速获取书籍是非常有用的,也是一种常见的情况。缓存的整个概念就是基于这个原理。
class Field {
  Position pos;
  int color;
  void draw(){
    // draw Field using pos
  }
}