簡體   English   中英

Java泛型是否允許在諸如short之類的原語數組中節省內存?

[英]Do Java generics allow for memory savings in arrays of primitives such as short?

我做了一些谷歌搜索,但是我一直無法找到這個問題的決定性答案。 為了澄清起見,請考慮以下類:

public class MyContainer<T> {
    private T[] _store;
    private int _size;
    ...
}

盡管必須使用ShortInteger類的原始包裝器類聲明引用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)

泛型是對象引用類型,因此將比基本intshort數組稍微大一些/慢一些。 與其他List相比,Java不會對諸如List<Integer>類的通用集合應用任何空間或時間優化,因為JVM內部在所有List實例之間共享相同的類和字節碼。 數組也是如此。

除非這是在關鍵性能堆棧底部附近使用的核心代碼,否則不必擔心內存或性能。 在設計階段優化中,只有最深循環,使用最頻繁和性能最受限制的代碼段才是候選對象。

泛型號都無關無論是原語內存節省。

盡管必須使用ShortInteger類的原始包裝器類聲明引用MyContainer的變量,並且必須使用MyContainer實例,但使用short類型的數組與int類型的數組是否可以節省內存?用相同的包裝器類創建?

只是建立在現有的答案,就可以實現與支持基本數組中的泛型集合接口,但不一般 例如, GuavaInts.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.

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