HashMap.values().addAll()이상

3352 단어 HashMapvalues()add()
문제:Collection.addAll()방법 을 사용 할 때 Unsupported Operation Exception 을 보고 합 니 다.트 레이스 원인 은 이 collection 이 hashMap.values()에서 나 온 것 임 을 발견 했다.
분석 원인:소스 코드 를 보면 hashMap.values()가 다음 과 같이 실 현 된 것 을 발견 할 수 있 습 니 다.
   //HashMap.java
   public Collection<V> values() {
        Collection<V> vs = values;
        return (vs != null ? vs : (values = new Values()));
    }
    
      private final class Values extends AbstractCollection<V> {
        public Iterator<V> iterator() {
            return newValueIterator();
        }
        public int size() {
            return size;
        }
        public boolean contains(Object o) {
            return containsValue(o);
        }
        public void clear() {
            HashMap.this.clear();
        }
    }
    
    //  values     :AbstractMap.java
      transient volatile Collection<V> values = null;
       public Collection<V> values() {
        if (values == null) {
            values = new AbstractCollection<V>() {
                public Iterator<V> iterator() {
                    return new Iterator<V>() {
                        private Iterator<Entry<K,V>> i = entrySet().iterator();

                        public boolean hasNext() {
                            return i.hasNext();
                        }

                        public V next() {
                            return i.next().getValue();
                        }

                        public void remove() {
                            i.remove();
                        }
                    };
                }

                public int size() {
                    return AbstractMap.this.size();
                }

                public boolean isEmpty() {
                    return AbstractMap.this.isEmpty();
                }

                public void clear() {
                    AbstractMap.this.clear();
                }

                public boolean contains(Object v) {
                    return AbstractMap.this.containsValue(v);
                }
            };
        }
        return values;
    }

위 코드 에서 보 듯 이 hashMap.values()는 values 가 비어 있 는 지 먼저 봅 니 다.
  • 비어 있 지 않 으 면 values 를 되 돌려 줍 니 다.values 는 AbstractMap 에서 정 의 된 것 입 니 다.초기 화 할 때 new 는 AbstractCollection 을 실 현 했 고 몇 가지 방법 을 실 현 했 지만 all()과 addAll()방법 을 실현 하지 못 했 습 니 다
  • 비어 있 으 면 new 내부 구현 클래스 Values.Values 역시 AbstractCollection 을 실현 하지 못 한 all()과 addAll()방법 을 실현 하지 못 했다

  • AbstractCollection 의 add()와 addAll()방법 을 살 펴 보 겠 습 니 다.
     //AbstractCollection.java
     public boolean add(E e) {
            throw new UnsupportedOperationException();
        }
        
     public boolean addAll(Collection<? extends E> c) {
            boolean modified = false;
            for (E e : c)
                if (add(e))
                    modified = true;
            return modified;
        }

    이 를 통 해 알 수 있 듯 이 add 방법의 실현 은 Unsupported Operation Exception 을 직접 던 지 는 것 입 니 다.addAll 방법 은 add 방법 을 호출 하고 간접 적 으로 이상 을 던 집 니 다.마찬가지 로 HashMap.values()호출 add()와 addAll()도 이상 을 던 집 니 다.
    결론:상기 분석 을 통 해 HashMap.values()호출 add()와 addAll()가 이상 한 원인 을 던 진 것 을 명 확 히 했다.또한 실제 사용 에 있어 서 HashMap.values().add()와 HashMap.values().addAll()을 직접 사용 하지 않도록 주의해 야 한다 고 알려 주 었 다.
    이 글 은"winger"블 로그 에서 나 왔 습 니 다.전 재 를 사절 합 니 다!

    좋은 웹페이지 즐겨찾기