在java(并发)hashmap中搜索*键

9avjhtql  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(725)

我可以通过搜索一个 equals() 是吗?怎样?
我在找这样的东西 getEntry(K key).getKey() 在第一次插入后,每次访问密钥时都会得到相同的引用,因此可以使用此引用而不是新生成的密钥来节省内存。
(很明显,人们可以专门为这个目的使用一个特殊的hashmap<k,k>,但实际上我已经有了一个map,我想知道是否可以使用它的键来实现这个目的)

uxhixvfz

uxhixvfz1#

你似乎在说你想要一个对象的引用在Map中作为一个键,用另一个恰好相等的对象来找到它 Object::equals 合同。
虽然我还没有尝试过这个代码,但我想你可以通过 Set Map上的钥匙。然后转换为 List . 在该列表中找到所需的对象,从列表的元素中检索引用。

Map< Car , Integer > map = … ;
Car car = new Car( … ) ;
map.put( car , 42 ) ;

Set< Car > carSet = map.keySet() ;
List< Car > carList = List.copyOf( carSet ) ;
Car similarCar = … ;
int index = carList.indexOf( similarCar ) ;
Car originalCar = carList.get( index ) ;  

boolean same = ( car == originalCar ) ;

您还可以从密钥集生成流,在第一次匹配时停止流,同时搜索匹配项。

wlp8pajw

wlp8pajw2#

无法从数据库检索原始密钥 HashMap ,而不是像这样进行暴力顺序搜索:

K keyToLookup = ...;

K originalKey = map.keySet().stream().filter(keyToLookup::equals).findAny().orElse(null);

选项1:嵌入键值
解决方案 HashMap 当然是将键对象作为值的一部分:
通过实际将键对象作为值对象的一部分,这通常是固有的,例如用户名到用户对象的Map。可能需要修改值对象,并且在更新Map条目以引用其他值对象时,可能需要删除和重新添加Map条目。
在一个单独的 Map<K, K> . 效率较低,因为你要查两遍。
通过将值更改为键/值对,例如。 Map<K, Entry<K, V>> . 这可能是最好的解决方案,但需要注意确保条目的key对象始终是原始的key。
选项2:使用navigablemap
如果 Map 可以从 HashMap 成为一个 NavigableMap ,例如 TreeMap ,它支持从Map中检索原始密钥对象,例如使用 ceilingEntry(K key)​ 方法。
关键对象必须实现 Comparable 或者 TreeMap 可以使用自定义 Comparator . 无论哪种情况,实现都必须与equals保持一致。
并非所有键类型都可以定义相对顺序,因此可能无法使用 NavigableMap .

K keyToLookup = ...;

Entry<K,​V> entry = map.ceilingEntry​(keyToLookup);
if (entry != null && entry.getKey().equals(keyToLookup)) {
    K originalKey = entry.getKey();
    V value = entry.getValue();
    // code here
} else {
    // key not found
}
yzxexxkh

yzxexxkh3#

想要获得密钥的“原始”是相当奇怪的…通常,用新创建的密钥进行轮询是“便宜”的,它们可以在以后被垃圾收集。我猜你有一个相当奇特的用例。
也就是说,你不可能用一个 HashMap 开箱即用。你能做的最接近的就是扩展它来暴露 getNode(...) 方法,允许您访问密钥。

相关问题