[英]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];
}
}
我知道此實現有效,我不知道的是
Arraylist
已經執行的所有強制轉換的方法嗎? 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.