2009-12-29 3 views
2

현재 HashMap<String, Integer>을 사용하여 문자열을 int로 매핑하고 int 값을 자주 액세스해야합니다.안드로이드의 문자열에 대한 효율적인 매핑

가능하면 최소한의 개체 생성으로 이것을 수행하는 더 좋은 방법을 찾고 있는데, Integer class으로 값을 래핑하지 않고 원시 int로 값을 저장할 수있는 것이 바람직합니다.

합니다 (SparseArray's int->object mapping의 기본적으로 반대.)

+0

int 값은 0x01, 0x02, 0x04, 0x08 및 0x10 중 하나 이상으로 구성된 마스크입니다. 최대 값은 31입니다. –

답변

0

가 컴파일 타임에 알려진 값을 임의의 있습니까? 이 경우 Java Enum 또는 Android Enum을 사용하십시오.

+0

int 값은 다음 중 하나 이상으로 구성된 마스크입니다. 0x01 , 0x02, 0x04, 0x08 및 0x10, 최대 값은 31입니다. –

0

HashMap을 사용하는 경우 일부 개체를 사용할 방법이 없습니다. 최대 값이 31이면 모든 값이 Integer 구현에 의해 캐시됩니다. autoboxing 또는 Integer.valueOf을 사용하여 Integer 인스턴스에 액세스하는 경우 객체 생성이 수행되지 않습니다 (new Integer(..) 제외).

개체 생성을 최소화하려면 원시 int 주위에 변경 가능한 래퍼를 작성할 수 있습니다. 하나의 대안은 약간의 오버 헤드가있는 java.util.concurrent.atomic.AtomicInteger을 (잘못) 사용하는 것입니다.

0

이 같은 클래스를 작성 :

public class Foo 
{ 
    public static final String A = "a"; 
    public static final String B = "b"; 

    public static int foo(String str) 
    { 
     final int val; 

     if(str == A || str.equals(A)) 
     { 
      val = 0x01; 
     } 
     else if(str == B || str.equals(B)) 
     { 
      val = 0x02; 
     } 
     // etc... 

     return (val); 
    } 
} 

당신만을 문자열의 수 만약 당신이 우리가 항상 .equals 여러 번 전화를받을하지 않을 정도로 작으며, 한 번 각각의 문자열을 만들 ethe 상수가 있으면 .equals가 전혀 호출되지 않습니다.

지도를 사용하면 이보다 많은 메모리가 필요하며 문자열 수가 적 으면 위 코드가 더 빠를 수도 있습니다. 또한 구현을 리팩토링하여 내부적으로 (또는 배열 등) 구현을 사용하고 가장 빠른 것을 확인하거나 API를 변경하지 않고도 최소한의 메모리를 사용할 수 있습니다.

편집 :

이 언어 (내가 생각하는)에 제공하고 안드로이드를 채택하는 경우, 당신은 내가 가지고있는 코드를 대체 할 수있을 것인지 ... proposal for switch with String입니다 보는 또 다른 것은 성능 위화감이없는 스위치를 사용하십시오. 기본적으로 hashCode를 전환 한 다음 동일한 hashCode가있는 객체에 대해서만 .equals를 호출합니다. 이것은 사전에 hashCodes를 알아 내야하고, hashCode는 항상 동일한 것을 반환합니다 (String은 hashCode가 작동해야하는 방식을 정의하므로 반드시 있어야합니다).

+0

실제로 스위치는 문자열에서 equals를 호출하지 않습니다. 컴파일러는 스위치의 모든 문자열에 대해 완벽한 해시 함수 (충돌 없음)를 생성합니다 (http://blogs.sun.com/darcy/entry/string_unhashing). –

+0

효율적인 (그리고 읽기 힘든) 구현은 같은 방식으로 구현 될 수 있습니다 : switch (hash (str)) {case HASH_VALUE_X : ...}'. 이렇게하면 if/else 대안보다 나은 바이트 코드 (http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14942)가 생성됩니다. –

+0

cool ...하지만 아직 언어가 없기 때문에 충돌로 끝날 수 있습니다. 이제 스위치의 문자열에 대한 완벽한 해시 함수를 backport해야 할 것입니다. 일하다... :-) – TofuBeer

관련 문제