簡體   English   中英

方法調用效率低下的新Integer(int)構造函數; 使用Integer.valueOf(int)代替

[英]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意味着更多的開銷,因此除非需要同步,否則如果需要排序,請堅持使用HashMapTreeMap

3.)為什么編輯器給Integer不必要的裝箱。

這可能只是因為可讀性( aInteger.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM