封装Map<>的keySet()的时间复杂度值

时间:2014-06-26 08:56:26

标签: java map set time-complexity

我需要一张带有签名的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视为地图?

3 个答案:

答案 0 :(得分:2)

keySet()不会创建新的Set

它只是提供地图中按键的视图。它实际上只提供了一些迭代(删除),大小,空白,清除和包含的操作。您无法向其添加元素,否则会抛出UnsupportedOperationException

答案 1 :(得分:2)

如果您正在询问Java的实现,HashMap会在第一次调用keySet()后对该集进行缓存。但即使第一次调用也不需要任何迭代,因为它只返回基础条目集的视图或包装器。

所以,是的,Java确实优化了它们的实现,但从技术上讲,您可以将相同的优化应用于自定义集。

答案 2 :(得分:0)

如果有超过2个字段,我们应该上课,就像你的前任一样。 Set<CustomKV> customMap;

如果只有两个值可以更好地使用Hashmap。

在这两种情况下我们都可以迭代。

但是在Hashmap的情况下,我们可以使用value通过get方法访问key,我们可以避免迭代。