从Java中的HashMap中获取密钥对象

从Java中的HashMap中获取密钥对象,java,dictionary,hashmap,Java,Dictionary,Hashmap,我想在Java中检索HashMap中键的原始对象,最好的方法是什么 比如说 HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); Integer keyObj = new Integer(10); Integer valueObj = new Integer(100); // And add maybe 1 million other key value pairs here //... lat

我想在Java中检索HashMap中键的原始对象,最好的方法是什么

比如说

HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
Integer keyObj = new Integer(10);
Integer valueObj = new Integer(100);

// And add maybe 1 million other key value pairs here
//... later in the code, if I want to retrieve the valueObj, given the value of a key to be 10
Integer retrievedValueObj = map.get(10);

//is there a way to retrieve the original keyObj object with value 10 from map?
HashMap map=newhashmap();
整数keyObj=新整数(10);
整数值obj=新的整数(100);
//在这里再加上一百万个键值对
//... 在代码的后面,如果我想检索valueObj,给定一个键的值为10
整数retrievedValueObj=map.get(10);
//有没有办法从map中检索值为10的原始keyObj对象?
基本上,用户可以在这里仅为key对象查询key的任何值,10只是一个示例。 一些评论说,“你已经有了x对象,为什么要得到它?” 这与说“您已经拥有了value对象,为什么要获取它?” 这就是HashMap数据结构、存储和检索的目的

检索值对象很容易,但似乎没有多少人知道如何检索键对象。 似乎很多人不明白我为什么要达到10的目标,并问为什么?为什么不只计算10呢。这只是一个大大简化的模型

好吧,让我讲一点背景。keyObj是另一个数据结构中的数据,我需要这个原始key对象的精确引用。比如说,有一个包含所有键值的链接列表,如果我想删除链接列表中的特定节点

我不仅对值“10”感兴趣,还对内存位置感兴趣,即Java中对“10”对象的引用。内存中可能有许多“10”。但那正是我想要找回的东西

下面的迭代器方法答案给出了一个O(n)方法。但我要寻找的是给定键值的键对象的O(1)检索

我能想到的一种方法是将关键对象也存储在值中,如

class KeyAndValue {
     public Integer key;
     public Integer value;
     public KeyAndValue(Integer key, Integer value) {
         this.key = key;
         this.value = value;
     }
}

map<Integer, keyAndValueL> map = new map<Integer, keyAndValueL>();
Integer x = new Integer(10);
map.add(x, new KeyAndValue(x, 100));

//then I can retrieve the reference of x, given value of key 10
Integer newKeyObj = map.get(10).key;
类键和值{
公开整数密钥;
公共整数值;
公钥和值(整型键,整型值){
this.key=key;
这个值=值;
}
}
map map=newmap();
整数x=新整数(10);
添加(x,新键和值(x,100));
//然后我可以检索x的引用,给定键10的值
整数newKeyObj=map.get(10.key);
但是这种方法使用了更多的内存,在我看来就像是一种黑客。我想知道Java中是否有更优雅的方式。

试试这个

        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        Integer keyObj = new Integer(10);
        Integer valueObj = new Integer(100);
        map.put(keyObj, valueObj);
        Set<Integer> keys = map.keySet();
        Iterator<Integer> iterator = keys.iterator();
        while(iterator.hasNext()){
            Integer x = iterator.next();
            if(map.get(x) == 100)
                System.out.println("key is "+ x);
        }
HashMap map=newhashmap();
整数keyObj=新整数(10);
整数值obj=新的整数(100);
地图放置(keyObj,valueObj);
Set keys=map.keySet();
迭代器迭代器=keys.Iterator();
while(iterator.hasNext()){
整数x=迭代器.next();
if(map.get(x)==100)
System.out.println(“键为”+x);
}
试试这个

        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        Integer keyObj = new Integer(10);
        Integer valueObj = new Integer(100);
        map.put(keyObj, valueObj);
        Set<Integer> keys = map.keySet();
        Iterator<Integer> iterator = keys.iterator();
        while(iterator.hasNext()){
            Integer x = iterator.next();
            if(map.get(x) == 100)
                System.out.println("key is "+ x);
        }
HashMap map=newhashmap();
整数keyObj=新整数(10);
整数值obj=新的整数(100);
地图放置(keyObj,valueObj);
Set keys=map.keySet();
迭代器迭代器=keys.Iterator();
while(iterator.hasNext()){
整数x=迭代器.next();
if(map.get(x)==100)
System.out.println(“键为”+x);
}

您可以像您在问题中提到的那样将key+value对象存储为value。

您可以像您在问题中提到的那样将key+value对象存储为value。

一种类似的方法,但更通用的方法是将“key+value”存储为条目,而不是封装在另一个类中。 例如:

Map Map=newhashmap();
整数x=新整数(10);
map.put(x,新的AbstractMap.SimpleEntry(x,100));
//然后我可以检索x的引用,给定键10的值
Entry keyObj=map.get(10);

一种类似但更通用的方法是将“key+value”存储为条目,而不是封装在另一个类中。 例如:

Map Map=newhashmap();
整数x=新整数(10);
map.put(x,新的AbstractMap.SimpleEntry(x,100));
//然后我可以检索x的引用,给定键10的值
Entry keyObj=map.get(10);

您正在实现的是的一个变体

这是使用每个托管对象到其自身的映射实现的最简单方法:

Map<T, T> cache = new HashMap<>();

这有O(1)个时间复杂度,并且对于这样管理的每个对象只使用一个额外的对象引用。

您正在实现的是的一个变体

这是使用每个托管对象到其自身的映射实现的最简单方法:

Map<T, T> cache = new HashMap<>();

这有O(1)个时间复杂度,并且对于这样管理的每个对象只使用一个额外的对象引用。

这真的没有任何意义。既然你已经知道了,为什么还要从地图上获取
键呢?!您的意思是获取给定值的所有键吗?签出可能是您需要的
map.keySet()
@music\u编码器否,键在HashMap中是唯一的。我试着只使用标准Java库而不是第三方库……这是一个完全正确的问题。您可能有一个与映射使用的键相同的键,但它不相同。不幸的是,
Map
接口无法获取O(1)中的键引用。除非您实现自己的映射或修改,例如
HashMap
(子类化没有帮助,因为您需要的方法是包私有的),否则我认为最简单的方法是将键引用存储在值中,正如您所说的。这真的没有任何意义。既然你已经知道了,为什么还要从地图上获取
键呢?!您的意思是获取给定值的所有键吗?签出可能是您需要的
map.keySet()
@music\u编码器否,键在HashMap中是唯一的。我试着只使用标准Java库而不是第三方库……这是一个完全正确的问题。您可能有一个与映射使用的键相同的键,但它不相同。不幸的是,
Map
接口无法获取密钥引用