자바 의 HashMap 깊이 복사 에 대한 테스트 와 몇 가지 생각

0. 머리말
일이 바 빠 진 후 오랫동안 알고리즘 을 보지 않 았 는데 DFA 민감 어 알고리즘 을 한참 잘 봐 야 이해 할 수 있 습 니 다.정말 3 단계 마방 환원 기법 과 마찬가지 로 전원 이 황폐 해 지 니 안 타 깝 군요.
DFA 알고리즘 에서 첫 번 째 단 계 는 데이터 구 조 를 이해 해 야 하 는데 이 를 바탕 으로 Hashmap 의 할당 과 관련된다.이곳 의 할당 은 매우 재 미 있 습 니 다. 세 개의 Hashmap 가 반복 적 으로 할당 하면 민감 한 어휘 표 의 초기 화 를 해결 할 수 있 습 니 다.
안 에는 모두 아래 의 Hashmap '얕 은 복사' 에 속 합 니 다. 그렇다면 자바 의 Hashmap 에는 어떤 복사 방법 이 있 습 니까?
1. 테스트 코드
HashMap hm_source = new HashMap();
HashMap hm_clone = new HashMap();
hm_source.put("1", "1");
        
// hashmap deep clone method 1
hm_clone = (HashMap)hm_source.clone();
// hashmap deep clone method 2
hm_clone.putAll(hm_source);// hashmap shadow clone
// hm_b = hm_a;

hm_source.put("2", "2");
System.out.println("hm_source     ,hm_source:"+hm_source);
System.out.println("hm_source     ,hm_clone:"+hm_clone);

System.out.println("          :"+(hm_source==hm_clone));
System.out.println("               :"+(hm_source.get(1)==hm_clone.get(1)));

위 에서 두 가지 Hashmap 깊이 복사 방법 을 소 개 했 는데 그것 이 바로 hashmap. clone () 과 hashmap. putAll (hm source) 이다. 효과 와 같이 출력 은 다음 과 같다.
hm_source     ,hm_source:{1=1, 2=2}
hm_source     ,hm_clone:{1=1}
          :false
               :true

그럼 얕 은 카 피 는 요?(코드 에 설명 되 어 있 는 부분, 직접 등호 = 할당) 출력 은 다음 과 같 습 니 다.
hm_source     ,hm_source:{1=1, 2=2}
hm_source     ,hm_clone:{1=1, 2=2}
          :true
               :true

2. 출력 분석
깊이 복사 가 확실히 그 이름 과 같다 는 것 을 발견 하기 어렵 지 않다.
딥 복사: 두 Hashmap 대상 은 전혀 무관 한 것 같 습 니 다. 서로 수정 요 소 를 추가 한 후에 상대방 에 게 영향 을 주지 않 습 니 다.
얕 은 복사: 두 개의 Hashmap 대상 은 바로 '소프트 링크 ln' 입 니 다. 서로 견제 합 니 다. 당신 이 바 뀌 었 으 니 저도 따라 변 합 니 다.
3. 상기 추측 이 정확 합 니까?
우리 당의 사상 노선 은 실사구시 로 근본 적 인 차 이 를 분석 할 것 으로 예상 되 며 JDK clone 함수 의 소스 코드 를 살 펴 볼 수 있다.
그러나 현상 에서 우리 가 얻 은 초보적인 결론 은 몇 가지 가 있다.
4. 567917. 얕 은 복사 대상 이 사용 하 는 메모리 주소 가 같 고 깊 은 복사 대상 의 주 소 는 '별도의 포 털' 이다
4. 567917. 깊이 복사 한 두 대상 도 '철저히 무관 하 다' 는 것 이 아니 라 요소 의 인용 만 복사 했다
결론 3.2 에 대하 여 나 도 HashMap 의 clone 방법 박문 에서 배 웠 습 니 다. 그 중에서 사용 하 는 Hashmap 요 소 는 Bean 유형 입 니 다. 깊이 복사 한 요소 의 수정 도 '뼈 를 부 러 뜨리 고 힘줄 을 연결 합 니 다' 라 고 두 개의 Hashmap 을 동시에 업데이트 시 킵 니 다.
그러나 '요소 수정' 에 국한 된다. 예 를 들 어 '요소 삭제' 하면 두 Hashmap 대상 은 '얼굴 을 돌려 사람 을 알 아 보지 못 한다' 고 해서 동시에 업데이트 되 지 않 는 다.
4、hashmap.clone()
JDK 는 얻 기 어 려 운 학습 자료 이 고 소스 코드 는 읽 어야 한다.지금도 붙 여 놓 고 기록 좀 해.
/**
     * Returns a shallow copy of this HashMap instance: the keys and
     * values themselves are not cloned.
     * 【     “   ”,      “       '   '”,    】
     * @return a shallow copy of this map
     */
    @SuppressWarnings("unchecked")
    @Override
    public Object clone() {
        HashMap result;
        try {
            result = (HashMap)super.clone();
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
        result.reinitialize();
        result.putMapEntries(this, false);
        return result;
    }
/**
     * Implements Map.putAll and Map constructor
     *
     * @param m the map
     * @param evict false when initially constructing this map, else
     * true (relayed to method afterNodeInsertion).
     */
    final void putMapEntries(Map extends K, ? extends V> m, boolean evict) {
        int s = m.size();
        if (s > 0) {
            if (table == null) { // pre-size
                float ft = ((float)s / loadFactor) + 1.0F;
                int t = ((ft < (float)MAXIMUM_CAPACITY) ?
                         (int)ft : MAXIMUM_CAPACITY);
                if (t > threshold)
                    threshold = tableSizeFor(t);
            }
            else if (s > threshold)
                resize();
            for (Map.Entry extends K, ? extends V> e : m.entrySet()) {
                K key = e.getKey();
                V value = e.getValue();
//【putVal           ,    Hashmap instance     ,   Hashmap    Node   】
                putVal(hash(key), key, value, false, evict);
            }
        }
    }

코드 최종 해석 권 은 JDK 1.8. x 가 소유 합 니 다.
 
다음으로 전송:https://www.cnblogs.com/zklidd/p/6719397.html

좋은 웹페이지 즐겨찾기