代码之家  ›  专栏  ›  技术社区  ›  Al.

Android中字符串到int的高效映射

  •  2
  • Al.  · 技术社区  · 16 年前

    目前我正在使用 HashMap<String, Integer> 要将字符串映射到int,需要经常访问int值。

    我正在寻找一种更好的方法来实现这一点,如果可能的话,只需创建最少的对象,并且最好能够将值存储为原始int,而不必使用 Integer class .

    SparseArray's int->object mapping .)

    3 回复  |  直到 11 年前
        1
  •  0
  •   Randolpho    16 年前

    它们是编译时已知的任意值吗?在这种情况下,使用Java Enum 或者安卓 Enum .

        2
  •  0
  •   Thomas Jung    16 年前

    如果你使用的是HashMap,那么就没有办法使用某个对象了。如果最大值为31,则整数实现将缓存所有值。只要使用自动装箱或 Integer.valueOf 访问整数实例(不是 new Integer(..) ).

    如果你想最小化对象的创建,你可以在原语int周围写一个可变的包装器 java.util.concurrent.atomic.AtomicInteger 有一些开销。

        3
  •  0
  •   TofuBeer    16 年前

    写一个这样的类:

    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不会被多次调用,如果总是使用eth常量,则.equals根本不会被调用。

    如果你使用一个映射,它将需要比这更多的内存,而且考虑到字符串的数量很小,上面的代码可能会更快。此外,您还可以重构实现,以便在内部使用映射(或数组,或其他任何东西),并查看什么是最快的/使用最少的内存,而无需更改API。

    编辑:

    另一个要看的是 proposal for switch with String ... 如果这一点进入语言(我想是的),如果Android采用它,那么你就可以用一个开关来替换上面的代码,而不会影响性能。实际上,它们对hashCode做了一个开关,然后只对具有相同hashCode的对象调用.equals。这确实要求您提前计算出哈希代码,并且hashCode总是永远返回相同的结果(这应该是因为String定义了hashCode必须工作的方式)。