Programing

HashSet / HashMap에 중복 값을 추가하면 이전 값이 대체됩니다

lottogame 2020. 7. 3. 18:45
반응형

HashSet / HashMap에 중복 값을 추가하면 이전 값이 대체됩니다


아래 코드를 고려하십시오.

HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)

hs.size()HashSet중복을 허용하지 않으므로 1을 지정 하므로 하나의 요소 만 저장됩니다.

중복 요소를 추가 한 다음 이전 요소를 대체하거나 단순히 추가하지 않는지 알고 싶습니다.

또한 HashMap같은 경우에 어떻게됩니까?


의 경우 HashMap이전 값을 새 값으로 바꿉니다.

의 경우 HashSet항목이 삽입되지 않습니다.


가장 먼저 알아야 할 것은 HashSeta처럼 작동 Set한다는 것입니다. 즉, 객체를에 직접 추가 HashSet하고 복제본을 포함 할 수 없습니다. 에 직접 값을 추가하면됩니다 HashSet.

그러나 HashMapA는 Map유형. 즉, 항목을 추가 할 때마다 키-값 쌍이 추가됩니다.

에서 HashMap중복 값을 가지고 있지만, 키를 복제 할 수 없습니다. 에서 HashMap새 항목 이전을 대체합니다. 가장 최근 항목은에 있습니다 HashMap.

HashMap과 HashSet 간의 링크 이해 :

기억 HashMap중복 키를 가질 수 없습니다. 무대 뒤에서을 HashSet사용합니다 HashMap.

에 객체를 추가하려고 할 HashSet때이 항목은 실제로 장면 뒤에 사용되는 HashMap것과 동일한 키로 저장됩니다 . 이 기본 에는 키-값 쌍이 필요하기 때문에 더미 값이 생성됩니다.HashMapHashSetHashMap

이제 동일한 객체에 다른 복제 객체를 삽입하려고 할 때 HashSet다시 HashMap아래 누워서 키로 삽입하려고 시도합니다 . 그러나 HashMap중복은 지원하지 않습니다. 따라서 HashSet해당 유형의 값은 하나만 유지됩니다. 참고로, 모든 중복 키에 대해 HashSet에 입력 한 값이 임의 / 더미 값이므로 키가 전혀 바뀌지 않습니다. 키를 제거하고 동일한 키 (더미 값이 동일 함)를 다시 추가하는 것은 전혀 의미가 없으므로 무시됩니다.

요약:

HashMap중복은 허용 values하지만 허용 하지는 않습니다 keys. HashSet중복을 포함 할 수 없습니다.

오브젝트의 추가가 성공적으로 완료되었는지 여부와 함께 재생하거나하지 않으려면, 당신은 확인할 수 있습니다 boolean당신이 호출 할 때 반환 된 값 .add()과 반환하는지 true또는 false. 반환 된 경우 true삽입 된 것입니다.


문서는 이 꽤 명확하다 : HashSet.add 하지 않는 대체 :

지정된 요소가 아직 없으면이 세트에 추가합니다. 보다 공식적으로,이 세트에 요소 e2가 포함되어 있지 않으면 지정된 세트 e를이 세트에 추가합니다 (e == null? e2 == null : e.equals (e2)). 이 세트에 이미 요소가 포함되어 있으면 호출은 세트를 변경하지 않고 false를 리턴합니다.

그러나 다음 대체합니다.HashMap.put

맵에 이전에 키에 대한 맵핑이 포함 된 경우 이전 값이 대체됩니다.


HashSet의 경우이를 대체하지 않습니다.

문서에서 :

http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E )

"지정된 요소가없는 경우이 세트에 지정된 요소를 추가합니다.보다 공식적으로,이 세트에 요소 e2가 포함되지 않은 경우 (e == null? e2 == null : e.equals ( 이 세트에 이미 요소가 포함되어 있으면 호출은 세트를 변경하지 않고 false를 리턴합니다. "


내가 틀렸다면 정정하십시오. 문자열을 사용하면 "Hi"== "Hi"가 항상 같은 개체가 아니기 때문에 항상 진실로 나오지는 않습니다.

그래도 1의 대답을 얻는 이유는 JVM이 가능한 경우 문자열 객체를 재사용하기 때문입니다. 이 경우 JVM은 문자열 오브젝트를 재사용하므로 Hashmap / Hashset의 항목을 겹쳐 씁니다.

그러나 값이 "Hi"인 다른 문자열 객체 일 수 있기 때문에이 동작이 보장되지는 않습니다. 표시되는 동작은 JVM 최적화 때문입니다.


HashSet이 HashMap에 의해 백업되므로 먼저 해시 맵에서 put 메소드를 확인해야합니다.

  1. 중복 값을 HashSet에 문자열 "One"이라고 추가하면
  2. 항목 ( "one", PRESENT)은 해시 맵에 삽입됩니다 (세트에 추가 된 모든 값의 경우 값은 "PRESENT"입니다 (Object 유형 인 경우)).
  3. Hashmap은 항목을 Map에 추가하고 값을 리턴합니다.이 경우 "PRESENT"이거나 Entry가 없으면 null입니다.
  4. 그런 다음 Hashset의 add 메소드는 Hashmap에서 반환 된 값이 null과 같으면 true를, 그렇지 않으면 false를 반환합니다. 이는 항목이 이미 존재 함을 의미합니다.

다르게 말하면 : 키가 이미 존재하는 HashMap에 키-값 쌍을 삽입하면 (해시 값 ()에서 동일한 값을 제공하고 equal ()은 true이지만 두 객체는 ​​여전히 몇 가지 방식으로 다를 수 있습니다 )의 경우 키가 바뀌지 않지만 값을 덮어 씁니다. 키는 해시 값 ()을 가져 와서 테이블에서 값을 찾는 데 사용됩니다. HashSet은 HashMap의 키를 사용하고 실제로 사용자에게 중요하지 않은 임의의 값을 설정하므로 Set의 요소도 대체되지 않습니다.


HashMap기본적으로 포함되어 Entry연속적으로 포함하는 Key(Object)Value(Object).Internally가 HashSet있습니다 HashMapHashMap이미 일부와 같은 값을 대체 할 pointed..but 정말 키 ??? 아니 대체 .. 그리고 그 여기에 트릭 않습니다. HashMap기본 값을 키로 유지하고 값 HashMap은 더미 객체입니다. 따라서 HashMap (기본 맵의 키)에 동일한 값을 다시 삽입하려고하면 키 (값은 HashSet)가 아닌 더미 값을 대체합니다.

HashSet 클래스에 대한 아래 코드를보십시오.

public boolean  [More ...] add(E e) {

   return map.put(e, PRESENT)==null;
}

여기서 e는 HashSet의 값이지만 기본 map.and의 키는 대체되지 않습니다. 혼란을 해결할 수 있기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/12940663/does-adding-a-duplicate-value-to-a-hashset-hashmap-replace-the-previous-value

반응형