我需要一张带有签名的HashMap
HashMap<Integer, Double> map;
但我封装了两个值,如:
class CustomKV
{
Integer key;
Double value;
}
因此,Map<>
变为
Set<CustomKV> customMap;
如果我使用Map
,当我想要重复密钥时,map.keySet()
就足够了。
但是,如果我使用第二个,我必须迭代CustomKV
的对象,然后添加所有key
,将它们添加到一个集合中,然后返回它。
我的问题是:Java有优化吗?或者每当我调用keySet()
时,它是否会迭代对象?
在这里,我写了两次迭代的区别:
for(Integer i : map.keySet())
for(CustomKV kv : customMap())
似乎它们是完全相同的。但我要问的是,如果我一直打电话
for(CustomKV kv : customMap)
int key = kv.getKey();
它会减慢我的速度,或者Java是否认识到这一点并将customMap
视为地图?
答案 0 :(得分:2)
keySet()
不会创建新的Set
。
它只是提供地图中按键的视图。它实际上只提供了一些迭代(删除),大小,空白,清除和包含的操作。您无法向其添加元素,否则会抛出UnsupportedOperationException
。
答案 1 :(得分:2)
如果您正在询问Java的实现,HashMap
会在第一次调用keySet()
后对该集进行缓存。但即使第一次调用也不需要任何迭代,因为它只返回基础条目集的视图或包装器。
所以,是的,Java确实优化了它们的实现,但从技术上讲,您可以将相同的优化应用于自定义集。
答案 2 :(得分:0)
如果有超过2个字段,我们应该上课,就像你的前任一样。 Set<CustomKV> customMap;
如果只有两个值可以更好地使用Hashmap。
在这两种情况下我们都可以迭代。
但是在Hashmap的情况下,我们可以使用value
通过get
方法访问key
,我们可以避免迭代。