【发布时间】:2014-08-28 18:04:07
【问题描述】:
我的目标是优化我的应用程序代码。我的代码如下所示:
int a = 10;
Map<String , Integer> myMap = new TreeMap<>();
myMap.put("first" , new Integer(a)); //[FindBugs] Method com.abc.xyz.Test.main(String[]) invokes inefficient new Integer(int) constructor; use Integer.valueOf(int) instead
当我在 Netbeans 中通过 Findbugs 进行静态分析时,它显示存在类似“方法调用效率低下的新 Integer(int) 构造函数;请改用 Integer.valueOf(int)”的警告/错误.
我知道 new Integer(int) 与 Integer.valueOf(int) 之间的区别。
一个创建一个额外的对象,另一个不创建。还有一个不缓存,另一个缓存。
所以我已经像这样修改了我的代码......
m.put("first" , Integer.valueOf(a)); // Unnecessary boxing to Integer
但同样也会发出警告“Innecessary boxing to Integer”(由编辑器而非 findbugs)。
所以,我又改成这样了......
m.put("first" , a); //No warning at all...
最终完全没有警告。
我的问题:
1.) 这个link 建议在内部(通过编译器) m.put("first" , a); 正在转换 m.put("first" , Integer .valueOf(a));
(在那个例子中,有一个 List-ArrayList,这里我们有 Map-TreeMap...仅供参考)。 那为什么编辑器会发出警告? 我该怎么办?优化的方式是什么?
2.) 如果不是Map,如果有像HashTable这样的数据结构,那么???
3.) 为什么编辑器对整数进行不必要的装箱。
4.) 为什么 m.put("first" , a) 有效?因为我正在传递原始变量,而map 的put() 只接受Object。那么是不是因为自动装箱?
【问题讨论】:
-
是的,这是由于自动装箱。
-
OK.thanks...那么优化的好方法是什么?最后一个??
-
我不认为你可以优化它,自动装箱为你做同样的工作,所以你不需要明确地做
valueOf(a)。
标签: java findbugs autoboxing