我的目标是优化我的应用程序代码。我的代码如下所示:
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进行静态分析时,它显示了一个警告/缺陷,如“Method invokes inefficient new Integer(int) constructor; use Integer.valueOf(int) instead”。
我知道new Integer(int)和Integer.valueOf(int)之间的区别。
其中一个会创建一个额外的对象,而另一个则不会。另外一个不进行缓存,而另一个则进行缓存。
因此,我已经修改了我的代码,像这样...
m.put("first" , Integer.valueOf(a)); // Unnecessary boxing to Integer
但由于编辑器(而不是FindBugs)的警告“将Integer装箱没有必要”,我又进行了修改。
因此,我将其再次更改为以下形式...
m.put("first" , a); //No warning at all...
最终不会给出任何警告。
我的问题:
1.)这个链接表明在编译器内部,m.put("first", a);被转换为m.put("first", Integer.valueOf(a));。(在该示例中使用了List-ArrayList,在此处我们使用Map-TreeMap...请注意)。那么为什么编辑器会发出警告?我应该怎么做?哪种方式是最优的?
2.)如果不是使用Map而是使用类似于HashTable的数据结构呢?
3.)为什么编辑器会提示Unnecessary boxing to Integer(不必要的将基本类型包装成Integer)?
4.)为什么m.put("first", a)有效?因为我传递了基本变量,而map的put()只接受对象。所以这是因为自动装箱吗?
valueOf(a)
。 - user1935024