Method调用低效的新Integer(int)构造函数; 请改用Integer.valueOf(int)

Man*_*hah 5 java autoboxing findbugs

我的目标是优化我的应用程序代码.我的代码看起来像这样:

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 
Run Code Online (Sandbox Code Playgroud)

当我在Netbeans中使用Findbugs进行静态分析时,它表明存在类似" 方法调用低效的新Integer(int)构造函数的警告/错误;使用Integer.valueOf(int) ".

我知道新的Integer(int)Integer.valueOf(int)之间的区别.

一个创建另一个对象而另一个不创建.还有一个不缓存和其他缓存.

所以我修改了我的代码......

m.put("first" , Integer.valueOf(a)); // Unnecessary boxing to Integer
Run Code Online (Sandbox Code Playgroud)

但同样也给出警告" 不必要的拳击到整数 "(编辑不是由findbugs).

所以,我已经像这样改变了......

m.put("first" , a); //No warning at all...
Run Code Online (Sandbox Code Playgroud)

最后没有任何警告.

我的问题:

1.)此链接建议在内部(通过编译器) m.put("first",a); 正在转换为 m.put("first",Integer.valueOf(a));

(在那个例子中,有一个List-ArrayList,这里我们有Map-TreeMap ... FYI).然后为什么编辑发出警告?我该怎么办?什么是优化方式?

2.)如果没有Map,如果有像HashTable这样的数据结构那么???

3.)为什么编辑器给整数提供不必要的拳击.

4.)为什么m.put("first",a)有效?因为我传递的是原始变量而map的put()只接受Object.那是因为自动拳击吗?

Tho*_*mas 4

1.) 此链接建议在内部(由编译器) m.put("first" , a); 正在 m.put("first" , Integer.valueOf(a)); 中进行转换

(在该示例中,有一个 List-ArrayList,这里有 Map-TreeMap...仅供参考)。那为什么编辑会发出警告呢?我该怎么办?优化的方式是什么?

是的,编译器知道m.put("first", a)只接受对象,因此应用自动装箱。就性能而言,使用自动装箱或写入Integer.valueOf(a)不会有任何区别。

另一方面,并new Integer(a)​​不比 慢Integer.valueOf(a)。不同之处在于,对于较小的绝对值(默认为 -128 到 127)Integer.valueOf(a)将使用缓存,即不会始终创建新对象。对于所有其他值,它new Integer(a)无论如何都会调用。

例子:

Integer.valueOf(1) == Integer.valueOf(1)将产生 true
Integer.valueOf(1000) == Integer.valueOf(1000)将产生 false
new Integer(1) == new Integer(1)将产生 false,因为此处未使用缓存

2.) 如果不是Map,如果有像HashTable这样的数据结构那么???

你为什么问这个?有,HashTable但由于它是同步的,因此意味着比 更大的开销HashMap,因此除非您需要同步,否则请坚持使用HashMap或者TreeMap如果您需要排序。

3.) 为什么编辑器对 Integer 进行不必要的装箱。

这可能只是因为可读性(a比 短Integer.valueOf(a))。

4.) 为什么 m.put("first" , a) 有效?因为我传递原始变量,而映射的 put() 只接受对象。那么是因为自动拳击吗?

见1