![](/img/trans.png)
[英]refactoring Java arrays and primitives (double[][]) to Collections and Generics (List<List<Double>>)
[英]Do Java generics allow for memory savings in arrays of primitives such as short?
我做了一些谷歌搜索,但是我一直無法找到這個問題的決定性答案。 為了澄清起見,請考慮以下類:
public class MyContainer<T> {
private T[] _store;
private int _size;
...
}
盡管必須使用Short
和Integer
類的原始包裝器類聲明引用MyContainer
的變量,並且必須使用MyContainer
實例,但使用short
類型的數組與int
類型的數組是否可以節省內存?用相同的包裝器類創建?
在搜索中,我發現Java編譯器將類型擦除應用於泛型,但是我不確定我現在可以假設Java對泛型數組沒有某種優化。
有人有證據支持或反對嗎? 提前致謝。
泛型本身不提供任何內存節省,並且Integer / Short大於原始的同類。
但是,使用Integer.valueOf(int)或Short.valueOf(short),或僅使用普通自動裝箱,將對常見的小的正數和負數重新使用共享實例。 這樣可以節省單獨實例化每個值的內存。
參見: http : //docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int)
泛型是對象引用類型,因此將比基本int
或short
數組稍微大一些/慢一些。 與其他List相比,Java不會對諸如List<Integer>
類的通用集合應用任何空間或時間優化,因為JVM內部在所有List
實例之間共享相同的類和字節碼。 數組也是如此。
除非這是在關鍵性能堆棧底部附近使用的核心代碼,否則不必擔心內存或性能。 在設計階段優化中,只有最深循環,使用最頻繁和性能最受限制的代碼段才是候選對象。
泛型號都無關無論是原語或內存節省。
盡管必須使用
Short
和Integer
類的原始包裝器類聲明引用MyContainer
的變量,並且必須使用MyContainer
實例,但使用short
類型的數組與int
類型的數組是否可以節省內存?用相同的包裝器類創建?
只是建立在現有的答案,就可以實現與支持基本數組中的泛型集合接口,但不一般 。 例如, Guava的Ints.asList(int...)
返回一個List<Integer>
實現,該實現由int[]
支持,並且在其所有方法調用上僅將box / unboxes裝箱。 但是Guava對於每種原語都有該模式的單獨實現-無法像您希望的那樣統一它。
另一種方法是使用
TIntArrayList.wrap(int[] array)
從Trove4j
庫中,該庫將數組包裝到Trove的集合中,使您可以節省內存並添加標准Java的ArrayList
功能,例如自動擴展,排序,選擇,迭代等。
為了符合Java集合(清單),您可以使用裝飾器
new TIntListDecorator(TIntList list)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.