簡體   English   中英

定制數組包裝類澆鑄的安全性/效率

[英]Custom array wrapper class casting safety/efficiency

我正在編寫一個需要通用列表的Java應用程序。 此列表需要能夠動態且相當頻繁地調整大小,對此的明顯答案是通用的Linkedlist 不幸的是,它還需要像通過調用索引添加/刪除值一樣頻繁地獲取/設置值。 這可以通過Arraylist很好地解決。 由於這兩個選項都不是我想要的,所以我創建了自己的通用數組包裝器類。 我已經知道很長時間了,在Java中創建通用數組是非法的,並且我讀到通常不用創建通用數組來定義數組的類型,而只是創建一個object[]數組,然后將其每個轉換元素分別設置為正確的類型。 這類似於Arraylist已有的功能; 但是,我讀過在Java中強制轉換是一個非常昂貴的操作。 因此,為了避免強制轉換的麻煩,我的自定義包裝器類看起來像這樣。

public abstract class CustomArrayWrapper<E extends Object>{
    private E[] content;

    public abstract E[] empty(int n);

    public CustomArrayWrapper(){
        this.content = empty(0);
    }

    public CustomArrayWrapper(int n){
        this.content = empty(n);
    }

    public CustomArrayWrapper(E[] content){
        this.content = content;
    }

    public E[] content(){
        return content;
    }
}

這只是該類的基本內容,但主要思想是,每次使用數組包裝器都會擴展empty(int n)方法,返回大小為n的E型數組,希望避免所有這些昂貴的事情鑄件。 使用String作為類型的示例如下。

public class StringArrayWrapper extends CustomArrayWrapper<String>{

    public StringArrayWrapper(){
        super();
    }

    public StringArrayWrapper(int n){
        super(n);
    }

    public StringArrayWrapper(String[] content){
        super(content);
    }

    public String[] empty(int n){
        return new String[n];
    }
}

我知道此實現有效,我不知道的是

  1. 實施安全嗎?
  2. 我知道強制轉換有點挑剔,因為Java中內置了很多隱式強制轉換,這實際上是一種解決Arraylist已經執行的所有強制轉換的方法嗎?
  3. 它是否比將每個元素轉換為ArrayList的適當類型更有效率/效率更低?

我建議您不要花費時間和精力來創建自定義集合類型,因為標准Java API已經包含了很多類型。 您將贏得時間,並且可以確定它是安全的並且可以正常運行。
例如,如果您確實需要經常調整大小,並且也經常獲取和設置項目,那么我會選擇其中一些:

1-如果您需要比調整大小更直接的訪問權限 :一定要使用ArrayList。
2-如果您需要比直接訪問更多的調整大小 :可以使用LinkedList。

我會嘗試使用HashMap ,因為它是一個試圖同時優化直接訪問和調整大小的集合,因此可能是您的最佳選擇。 唯一的區別是,必須使用鍵而不是索引來訪問集合內的值,但是仍然可以像在數組中使用int索引一樣使用Integer鍵。 一件好事是您還可以使用任何類型的對象作為鍵。

此外,您可以使用LinkedHashMap ,因為如果需要,可以更快地遍歷整個集合。

無論如何,我不能保證這些是供您使用的最佳選擇,但是我可以保證您會找到在Java API中使用的正確的(已經開發的)集合類型。

這就是為什么我建議您閱讀有關收藏的官方文檔,您將對它們有一個總體了解,並能夠針對您的特定問題選擇最有效的-> https://www.tutorialspoint.com/java/ java_collections.htm

檢查展開的鏈表 ,這可能是您需要的。

接下來,您可能需要考慮通過擴展AbstractList使其與集合框架保持一致來實際實現List 使用“數組包裝器”最終將很麻煩。

接下來,強制轉換可能會有一些開銷(請參閱Java強制轉換會引入開銷嗎?為什么? ),但我認為這沒有什么值得考慮的。 這種方法的缺點是每次使用時都需要使用empty方法。 從我的角度來看,對於可疑的性能改進而言,這個價格太高了。

要回答您的問題:

  • 創建在子類中實現的數組模板方法是可以的。 最不安全的是您在content方法中公開此數組。
  • 我認為您不能擺脫任何偏見。 我也不認為投射性能值得擔心。
  • 運行基准並進行測量。 我認為這樣會更有效,因為不需要類型檢查,但這不會很重要/不明顯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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