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

时间:2014-08-28 09:47:38

标签: java findbugs autoboxing

我的目标是优化我的应用程序代码。我的代码如下所示:

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

但同样也会发出警告“不必要的拳击到整数”(由编辑而非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 ... FYI)。 然后为什么编辑发出警告? 我该怎么办?什么是优化方式?

2。)如果没有地图,如果有任何数据结构,如 HashTable 那么???

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

4。)为什么 m.put(“first”,a)有效?因为我传递原始变量而地图的put()只接受对象。那是因为自动装箱

2 个答案:

答案 0 :(得分:4)

  

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

     

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

是的,编译器知道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)将产生真实的结果 Integer.valueOf(1000) == Integer.valueOf(1000)将产生错误 new Integer(1) == new Integer(1)将产生错误,因为此处未使用缓存

  

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

你为什么这么问?有HashTable但由于它是同步的,因此意味着比HashMap更多的开销,因此,如果您需要排序,则需要同步到HashMapTreeMap

  

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

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

  

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

见1

答案 1 :(得分:1)

  

4.。)为什么m.put(&#34; first&#34;,a)有效?因为我传递的是原始变量而map#的put()只接受Object。

自动装箱。

int会自动转换为Integer,反之亦然(在这种情况下可能会出现NullPointerException)

  

3。)为什么编辑器给Integer提供不必要的拳击。

因为您不需要编写这段代码。编译器会为你做。

通常更具可读性

  

2。)如果不是Map,如果有像HashTable这样的数据结构,那么大小写相同???

JDK集合中的

是仅适用于对象。这意味着必须将原始类型装箱。它具有较小的运行时成本和巨大的内存开销。整数占用的内存比int大300%。

你无法摆脱它。避免拳击开销的唯一方法是使用像GNU trove这样的专用集合,每个基本类型提供一个类。仅在计划将数百万个原始元素存储到集合中时才有用。

最后永远不会写新的整数(x)。 Integer.valueOf(x)执行相同的操作,但它维护一个内部缓存,以避免为某些常用值创建新实例。