정수를 키로, 객체를 값으로 갖는 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 에서 오토 박싱에 대한 자세한 내용을 읽을 수 있습니다.
