[英]Method invokes inefficient new Integer(int) constructor; use Integer.valueOf(int) instead
我的目的是優化我的應用程序代碼。 我的代碼如下所示:
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
但同樣會發出警告“ 對Integer不必要的裝箱 ”(由編輯器而不是findbugs發出)。
所以,我又像這樣改變了它。
m.put("first" , a); //No warning at all...
最終完全沒有發出任何警告 。
我的問題:
1.)此鏈接建議在內部(通過編譯器) m.put(“ first”,a); 正在轉換為m.put(“ first”,Integer.valueOf(a));
(在該示例中,有一個List-ArrayList,這里有Map-TreeMap ... FYI)。 那為什么編輯會給出警告呢? 那我該怎么辦? 優化的方法是什么?
2.)如果不是Map ,那么如果有任何數據結構(例如HashTable),那么???
3.)為什么編輯器給Integer不必要的裝箱 。
4.)為什么m.put(“ first”,a)有效? 因為我正在傳遞原始變量,並且map的put()僅接受Object 。 那是因為自動裝箱嗎?
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)
將產生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)有效? 因為我正在傳遞原始變量,並且map的put()僅接受Object。 那是因為自動裝箱嗎?
查看1
4.)為什么m.put(“ first”,a)有效? 因為我正在傳遞原始變量,並且map的put()僅接受Object。
自動裝箱。
int會自動轉換為Integer,反之亦然(在這種情況下,可能會出現NullPointerException)
3.)為什么編輯器給Integer不必要的裝箱。
因為您不需要編寫這段代碼。 編譯器將為您完成此任務。
通常更具可讀性
2)如果不是Map,如果有像HashTable這樣的數據結構,那么大小寫是一樣的???
是,在JDK集合中僅適用於對象。 這意味着必須將基本類型裝箱。 它具有較小的運行時成本和巨大的內存開銷。 整數要比整數多占用300%的內存。
你無法逃脫它。 避免裝箱開銷的唯一方法是使用專門的集合,例如GNU trove,它為每個原始類型提供一個類。 僅在計划將數百萬個基本元素存儲到集合中時有用。
最后,永遠不要編寫新的Integer(x)。 Integer.valueOf(x)做同樣的事情,但它維護內部緩存,以避免為某些常用值創建新實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.