目前我正在使用HashMap<String, Integer>
将字符串映射到int,并且需要经常访问int值。
如果可能的话,我正在寻找一种更好的方法来创建最少的对象,并且最好能够将值存储为原始的int而不用Integer class
包装它们。
(基本上,与SparseArray's int->object mapping
相反。)
答案 0 :(得分:0)
答案 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必须工作的方式,所以它应该这样做。)