【问题标题】:why does return type of values in iterator not a set?为什么迭代器中的返回值类型不是集合?
【发布时间】:2013-08-10 11:59:39
【问题描述】:

在地图界面中

  Collection<V> values();

为什么这个函数不像entrySet()keySet()一样返回Set?

谢谢。

【问题讨论】:

  • 反过来 - 为什么它会返回 Set
  • 如果地图有几次相同的值,你想知道怎么办?
  • @Pshemo 得到你的答案。另外,为什么 keyset() 返回 Set。
  • @Thinker 因为 Map 中的所有键都是唯一的,所以 Set 是最适合返回它们的类型。

标签: java collections map


【解决方案1】:

在映射中,键是唯一的,但可以映射到相同的值。

换一种说法:

  • 这些值不一定是唯一的,因此不能在不丢失重复项的情况下存储在集合中。

  • 另一方面,键和整体是唯一的。

【讨论】:

    【解决方案2】:

    因为,Sets 不允许重复,并且您的 Map 可以有两个键映射到相同的值。 Map 只要求它的键是唯一的,而不是它的值。

    【讨论】:

      【解决方案3】:

      Map的keyset是Set,values是Collection:

      public interface Map<K,V> {
      
          // Basic operations
          V put(K key, V value);
          V get(Object key);
          V remove(Object key);
          boolean containsKey(Object key);
          boolean containsValue(Object value);
          int size();
          boolean isEmpty();
      
          // Bulk operations
          void putAll(Map<? extends K, ? extends V> m);
          void clear();
      
          // Collection Views
          public Set<K> keySet();
          public Collection<V> values();
      

      至于为什么 keyset 是一个 Set,而重视一个 Collection,你有你的答案here

      values — Map 中包含的值的集合。这个 Collection 不是 Set,因为多个键可以映射到同一个 价值。

      【讨论】:

        【解决方案4】:

        Map 有一组唯一的键,每个键都映射到一个值。

        Set 包含一组唯一的值。根据它的合同,它不能包含重复。

        所以,让我们从如下所示的Map 开始:

        final Map<String, String> map = new HashMap<>();
        map.put("ONE", "TEST");
        map.put("TWO", "TEST");
        

        所以keySet 返回SetONE, TWO。但值是TEST, TEST,它们不是唯一的,因此不能放入Set

        【讨论】:

          猜你喜欢
          • 2012-06-16
          • 1970-01-01
          • 2016-09-23
          • 2015-06-03
          • 1970-01-01
          • 1970-01-01
          • 2016-02-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多