자바 의 HashMap 깊이 복사 에 대한 테스트 와 몇 가지 생각
7967 단어 자바데이터 구조 와 알고리즘
일이 바 빠 진 후 오랫동안 알고리즘 을 보지 않 았 는데 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.