HashMap 및 int를 키로
정수를 키로, 객체를 값으로 사용합니다.
내 구문은 다음과 가변됩니다.
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
그러나 반환 된 오류는 다음과 변동될 수 있습니다.- "int"토큰에 대한 구문 오류,이 이후에 토큰 차원에서 예상되는 차원을 추가해야하는 이유 (예 : int를 배열로 만들기)를 사용할 수 없습니다. . 열쇠로.
내가 뭘 할 수 있니?
미리 감사드립니다! :)
HashMap은 내부적으로 사용하기 때문에 기본 형식을 사용할 수 없습니다. 따라서 Object (즉, 모든 개체)에서 상속 된 개체 만 사용할 수 있습니다.
그것은 HashMap의 함수가 K를위한 ()이고 보시다시피 Object를 사용합니다.
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>();
이것으로 정수 대신 int를 사용할 수 있습니다.
int newPos = 3;
myMap.put(newPos, newObject);
myMap.get(newPos);
Trove http://trove.starlight-systems.com/을 찾아 볼 수 있습니다.
TIntObjectHashMap은 아마도 당신이 찾고있는 존재하는 것입니다.
HashMap은 기본 데이터 유형을 인수로 허용하지 않습니다. 수업 만 받아 들일 수 있으므로
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
작동 안 할 것이다.
선언을 다음으로 변경해야합니다.
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
그래서 당신이 다음을 할 때도
myMap.put(2,myObject);
기본 데이터 유형은 정수 객체에 자동 박싱됩니다.
8 (int) === boxing ===> 8 (Integer)
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 에서 오토 박싱에 대한 자세한 내용을 읽을 수 있습니다.
Android에서 코딩하는 경우 정수를 객체에 매핑하는 SparseArray 가 있습니다.
HashMap이 프리미티브를 키로 허용하지 않는 주된 이유는 HashMap 이 키 비교를 위해 equals () 메소드를 사용하고 프리미티브가 아닌 객체에서만 메소드를 호출 할 수 있도록 설계 되었기 때문 입니다.
따라서 int가 Integer로 자동 박싱되면 Hashmap은 Integer 객체에서 equals () 메서드를 호출 할 수 있습니다 .
그렇기 때문에 int 대신 Integer를 사용해야합니다. 내 말은 hashmap이 int를 키로 넣는 동안 오류를 던진다는 것을 의미합니다 (발생한 오류의 의미를 모릅니다)
그리고 그렇게 생각한다면 프리미티브를 키로 만들어 Map 성능을 더 빠르게 만들 수 있습니다 . Int 유형을 키로하는 Map 구현을 포함하는 FastUtil 이라는 라이브러리 가 있습니다.
이 때문에 Hashmap 보다 훨씬 빠릅니다.
int를 기본 유형이 아닌 Object로 사용하십시오.
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
사용하시기 바랍니다 HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
숫자 만 키로 저장하면되므로 차원을 추가해야하는 이유를 이해하지 못합니다 (예 : int를 배열로 만들기).
배열도 Object이므로 HashMap<int[], MyObject>int 배열을 키로 사용하는 유효한 구성입니다.
컴파일러는 사용자가 원하는 것이 무엇인지, 무엇을 필요로하는지 알지 못합니다. 거의 올바른 언어 구조 만보고 완전히 정확하기 위해 누락 된 것이 무엇인지 경고합니다.
참고 URL : https://stackoverflow.com/questions/16148575/hashmap-and-int-as-key
'IT' 카테고리의 다른 글
| 파일을 사용하여 파일의 디렉토리를 어떻게 얻습니까? (0) | 2020.08.20 |
|---|---|
| Runtime.exec ()에서 파이프를 작동시키는 방법은 무엇입니까? (0) | 2020.08.20 |
| 삼각 함수는 어떻게 작동합니까? (0) | 2020.08.20 |
| 기본 매개 변수 값으로 SQL 함수? (0) | 2020.08.20 |
| IDLE에서 명령 내역에 어떻게 액세스 할 수 있습니까? (0) | 2020.08.20 |