[java] HashMap 및 int를 키로

정수를 키로, 객체를 값으로 갖는 HashMap을 구축하려고합니다.

내 구문은 다음과 같습니다.

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

그러나 반환 된 오류는 다음과 같습니다.- “int”토큰에 대한 구문 오류,이 토큰 이후에 예상되는 차원-숫자 만 저장하면되므로 차원을 추가해야하는 이유 (예 : int를 배열로 만들기)를 이해할 수 없습니다. 열쇠로.

내가 뭘 할 수 있니?

미리 감사드립니다! 🙂



답변

HashMap은 키에 대해 내부적으로 객체를 사용하기 때문에 기본 형식을 사용할 수 없습니다. 따라서 Object (즉, 모든 개체)에서 상속 된 개체 만 사용할 수 있습니다.

그것은 HashMap의 함수 put ()이고 보시다시피 Object for K를 사용합니다.

public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key);
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

“k = e.key”라는 표현을 사용하면 명확 해집니다.

Integer 및 autoboxing과 같은 래퍼를 사용하는 것이 좋습니다.


답변

Integer대신 사용하십시오 .

HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();

Java는 자동으로 int기본 값을 Integer객체에 자동 상자 화 합니다.

Oracle Java 문서에서 오토 박싱 에 대해 자세히 알아보십시오 .


답변

Android 장치 용 Java를 코딩하고 여기까지 오는 모든 사용자를 위해 : SparseArray더 나은 성능을 위해 사용하십시오 .

private final SparseArray<myObject> myMap = new SparseArray<myObject>();

이것으로 Integer 대신 int를 사용할 수 있습니다.

int newPos = 3;

myMap.put(newPos, newObject);
myMap.get(newPos);


답변

Trove http://trove.starlight-systems.com/을 사용해 볼 수 있습니다.
TIntObjectHashMap은 아마도 당신이 찾고있는 것일 것입니다.


답변

HashMap이 프리미티브를 키로 허용하지 않는 주된 이유는 HashMap 이 키 비교를 위해 equals () 메소드를 사용하고 프리미티브가 아닌 객체에서만 메소드를 호출 할 수 있도록 설계 되었기 때문 입니다.

따라서 int가 Integer로 자동 박싱되면 Hashmap은 Integer 객체에서 equals () 메서드를 호출 할 수 있습니다 .

그렇기 때문에 int 대신 Integer를 사용해야합니다. int를 키로 넣는 동안 hashmap에서 오류가 발생 함을 의미합니다 (발생한 오류의 의미를 모릅니다).

그리고 그렇게 생각한다면 프리미티브를 키로하여 Map 성능을 더 빠르게 만들 수 있습니다 . Int 유형을 키로하는 Map 구현을 포함하는 FastUtil 라이브러리 가 있습니다.

이 때문에 Hashmap 보다 훨씬 빠릅니다.


답변

HashMap은 기본 데이터 유형을 인수로 허용하지 않습니다. 객체 만 받아 들일 수 있으므로

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

작동 안 할 것이다.

선언을 다음으로 변경해야합니다.

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

그래서 당신이 다음을 할 때도

myMap.put(2,myObject);

기본 데이터 유형은 Integer 객체에 자동 박싱됩니다.

8 (int) === boxing ===> 8 (Integer)

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 에서 오토 박싱에 대한 자세한 내용을 읽을 수 있습니다.


답변

Android에서 코딩하는 경우 정수를 객체에 매핑하는 SparseArray 가 있습니다.