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.那是因为自动拳击吗?
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
归档时间: |
|
查看次数: |
3207 次 |
最近记录: |