카테고리 보관물: Java

Java

중복 키를 HashMap에 넣으면 어떻게됩니까? 어떻게됩니까? 그리고 값이 반복된다면

I가 동일한 키를 여러 번 전달하는 경우 HashMapput방법, 무슨 일이 원래 값은 어떻게됩니까? 그리고 값이 반복된다면 어떻게 될까요? 이것에 대한 문서를 찾지 못했습니다.

사례 1 : 키의 덮어 쓰기 값

Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","not one");
mymap.put("1","surely not one");
System.out.println(mymap.get("1"));

우리는 얻는다 surely not one.

사례 2 : 중복 가치

Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","not one");
mymap.put("1","surely not one");
// The following line was added:
mymap.put("1","one");
System.out.println(mymap.get("1"));

우리는 얻는다 one.

그러나 다른 가치는 어떻게됩니까? 나는 학생에게 기초를 가르치고 있었고 나는 이것을 물었다. 는 IS Map마지막 값이 참조 (그러나 메모리)되는 버킷 등?



답변

정의에 따라, put명령은 맵에서 지정된 키와 연관된 이전 값을 대체합니다 (개념적으로 기본 유형의 배열 색인화 조작과 유사 함).

지도는 단순히 값에 대한 참조를 삭제합니다. 그 밖의 다른 객체에 대한 참조가 없으면 해당 객체는 가비지 수집 대상이됩니다. 또한 Java는 주어진 키와 관련된 이전 값을 반환하거나 null존재하지 않는 경우 반환하므로 필요한 내용을 확인하고 필요한 경우 참조를 유지할 수 있습니다.

자세한 내용은 여기 : HashMap Doc


답변

Map # put (K, V) 의 javadoc에서 실제로 답변을 찾을 수 있습니다 (실제로 무언가를 반환합니다).

public V put(K key,
             V value)

지정된 값을이 맵의 지정된 키와 연관시킵니다 (선택적 조작). 맵에 이전에이 키에 대한 맵핑이 포함 된 경우 이전 값이 지정된 값으로 대체됩니다. (지도 m는 을 반환하는 k경우에만 키에 대한 매핑을 포함한다고합니다 .)m.containsKey(k)true

파라미터 :
key -지정된 값을 관련 짓는 키.
value-지정된 키와 관련된 값.

반환 값 :
지정된 키에 관련한 값 또는 null매핑이 없었던 경우 key. (A null창은 표시 할 수있는 이전에 관련된지도를 null지정하여 key, 구현을 지원하는 경우 null의 값).

따라서 호출 할 때 반환 된 값을 할당하지 않으면 mymap.put("1", "a string")참조되지 않으므로 가비지 수집이 가능합니다.


답변

키의 이전 값이 삭제되고 새 값으로 바뀝니다.

키에 주어진 모든 값을 유지하려면 다음과 같이 구현하는 것이 좋습니다.

import org.apache.commons.collections.MultiHashMap;
import java.util.Set;
import java.util.Map;
import java.util.Iterator;
import java.util.List;
public class MultiMapExample {

   public static void main(String[] args) {
      MultiHashMap mp=new MultiHashMap();
      mp.put("a", 10);
      mp.put("a", 11);
      mp.put("a", 12);
      mp.put("b", 13);
      mp.put("c", 14);
      mp.put("e", 15);
      List list = null;

      Set set = mp.entrySet();
      Iterator i = set.iterator();
      while(i.hasNext()) {
         Map.Entry me = (Map.Entry)i.next();
         list=(List)mp.get(me.getKey());

         for(int j=0;j<list.size();j++)
         {
          System.out.println(me.getKey()+": value :"+list.get(j));
         }
      }
   }
}

답변

키 / 값 기능이며 여러 값에 대해 중복 키를 가질 수 없었
습니다. 예를 들어 값이 “1”인 값을 얻으려고 할 때 입력 된 키 에 속하는 값 중 실제 값 을 얻으려는 경우 그것은?!
이것이 모든 값에 대해 고유 한 키를 가지지 만 Java 표준 lib로 트릭을 가질 수있는 이유입니다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class DuplicateMap<K, V> {

    private Map<K, ArrayList<V>> m = new HashMap<>();

    public void put(K k, V v) {
        if (m.containsKey(k)) {
            m.get(k).add(v);
        } else {
            ArrayList<V> arr = new ArrayList<>();
            arr.add(v);
            m.put(k, arr);
        }
    }

     public ArrayList<V> get(K k) {
        return m.get(k);
    }

    public V get(K k, int index) {
        return m.get(k).size()-1 < index ? null : m.get(k).get(index);
    }
}

그리고 당신은 이런 식으로 그것을 사용할 수 있습니다 :

    public static void main(String[] args) {
    DuplicateMap<String,String> dm=new DuplicateMap<>();
    dm.put("1", "one");
    dm.put("1", "not one");
    dm.put("1", "surely not one");
    System.out.println(dm.get("1"));
    System.out.println(dm.get("1",1));
    System.out.println(dm.get("1", 5));
}

인쇄 결과는 다음과 같습니다.

[one, not one, surely not one]
not one
null

답변

지정된 값을이 맵의 지정된 키와 연관시킵니다. 맵에 이전에 키에 대한 맵핑이 포함 된 경우 이전 값이 대체됩니다.


답변

그것은 기존 값 대신 각각의 키에 대한지도를. 같은 이름의 키가 없으면 제공된 값으로 키를 만듭니다. 예 :

Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","two");

OUTPUT
키 = “1”, 값 = “two”

따라서 이전 값을 덮어 씁니다.


답변

지도가 양동이와 같은지 여부에 대한 질문 : 아니오.

name=value쌍이 있는 목록과 name같지만 String 일 필요는 없습니다 (그렇지만 가능합니다).

요소를 얻으려면 키를 get () 메서드에 전달하면 할당 된 객체가 반환됩니다.

그리고 해시 맵은 get-method를 사용하여 객체를 검색하려고하면 실제 객체를 제공된 객체와 비교하지 않습니다. 목록을 반복하고 키를 비교해야하기 때문입니다. 현재 요소를 제공했습니다.

이것은 비효율적입니다. 대신, 객체가 무엇으로 구성되어 있더라도 두 객체 모두에서 소위 해시 코드를 계산하고 비교합니다. int2 개의 전체 (아마도 매우 복잡한) 객체 대신 2를 비교하는 것이 더 쉽습니다 . 해시 코드는 미리 정의 된 길이 (int)를 갖는 요약과 같이 상상할 수 있으므로 고유하지 않으며 충돌이 있습니다. 링크를 삽입 한 설명서에서 해시 코드에 대한 규칙을 찾을 수 있습니다.

이것에 대해 더 알고 싶다면 javapractices.comtechnofundo.com의 기사를 살펴보고 싶을 것이다.

문안 인사