我的目标是优化我的应用程序代码。我的代码如下所示:
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()只接受对象。那是因为自动装箱?
答案 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
更多的开销,因此,如果您需要排序,则需要同步到HashMap
或TreeMap
。
3。)为什么编辑器给整数提供不必要的拳击。
这可能只是因为可读性(a
比Integer.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提供不必要的拳击。
因为您不需要编写这段代码。编译器会为你做。
通常更具可读性
JDK集合中的2。)如果不是Map,如果有像HashTable这样的数据结构,那么大小写相同???
是仅适用于对象。这意味着必须将原始类型装箱。它具有较小的运行时成本和巨大的内存开销。整数占用的内存比int大300%。
你无法摆脱它。避免拳击开销的唯一方法是使用像GNU trove这样的专用集合,每个基本类型提供一个类。仅在计划将数百万个原始元素存储到集合中时才有用。
最后永远不会写新的整数(x)。 Integer.valueOf(x)执行相同的操作,但它维护一个内部缓存,以避免为某些常用值创建新实例。