在Android中有效地将字符串映射到整数

时间:2009-12-29 14:49:06

标签: java android performance

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

如果可能的话,我正在寻找一种更好的方法来创建最少的对象,并且最好能够将值存储为原始的int而不用Integer class包装它们。

(基本上,与SparseArray's int->object mapping相反。)

3 个答案:

答案 0 :(得分:0)

编译时是否知道任意值?在这种情况下,请使用Java Enum或Android Enum

答案 1 :(得分:0)

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

如果要最小化对象创建,可以在原始int周围编写一个可变包装器。一种替代方法是(错误地)使用java.util.concurrent.atomic.AtomicInteger,这有一些开销。

答案 2 :(得分: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不会被多次调用,如果你总是使用常量,那么.equals就不会被调用。< / p>

如果使用Map,它将占用更多的内存,并且假设Strings的数量很少,上面的代码可能会更快。您还可以重构实现以在内部使用Map(或数组,或其他),并查看最快/使用最少内存而无需更改API。

编辑:

要看的另一件事是proposal for switch with String ...如果它进入语言(我认为是)并且如果Android采用它,那么你将能够用上面的代码替换上面的代码切换没有性能损失。基本上,他们在hashCode上进行切换,然后只在具有相同hashCode的对象上调用.equals。这确实要求您事先弄清楚hashCodes,并且hashCode总是永远返回相同的东西(因为String定义了hashCode必须工作的方式,所以它应该这样做。)