2009-08-19 53 views
20

在Java API中是否有可擴展的數組類,可以與原始類型(int,char,double等)一起使用,類似於VectorArrayList類?Java矢量或基元ArrayList

我需要一個快速,可擴展的整數數組,並且爲了將它們包裝在Integer類中以便將它們包裝在VectorArrayList中,似乎很浪費。我的google-fu讓我失望。

+5

+1表示「我的Google-fu失敗了我」。 – kevinarpe 2012-02-09 06:51:19

回答

34

不幸的是沒有這樣的類,至少在Java API中。有第三方產品Primitive Collections for Java

將自動裝箱與現有集合類(特別是List實現)一起使用非常危險。例如:

List<Integer> l = new ArrayList<Integer>(); 
l.add(4); 

l.remove(4); //will throw ArrayIndexOutOfBoundsException 
l.remove(new Integer(4)); //what you probably intended! 

而且這也是神祕NullPointerExceptions公共源訪問(可能通過一個Map):

Map<String, Integer> m = new HashMap<String, Integer>(); 
m.put("Hello", 5); 
int i = m.get("Helo Misspelt"); //will throw a NullPointerException 
+1

換句話說,使用第三方庫之一或自己寫。知道了謝謝! :) – 2009-08-19 18:22:29

+9

+ 1爲刪除(4)刪除(新的整數(4))的例子! – 2010-07-25 01:01:07

+2

** Java的原始集合**已被標記爲在SourceForge上被刪除。 – Stephan 2013-09-11 14:29:25

13

http://trove4j.sourceforge.net/

的特羅韋庫提供高速的 的Java 定期和原始收藏。

請注意,由於Trove使用原語,它定義的類型不會實現java.util集合接口。

(LGPL許可證)

+0

這是用於商業軟件開發。雖然我認爲我們可以使用LGPL'd代碼,但我必須與人員覈對,在這種情況下,編寫自己的課程可能會更容易。我會爲未來開放源代碼的東西記錄圖書館,但我感謝! – 2009-08-19 18:09:19

+0

如果LGPL被禁止,那麼這就排除了很大比例的開源庫。你在期待什麼? – skaffman 2009-08-19 18:12:02

+0

只需要知道我是否在JDK中丟失了某些東西。 LGPL不是沒有限制的,但是在這種情況下,我可以用比自己的類更少的時間編寫自己的類,以便在庫上獲得好處,並將其集成並使用它編寫代碼。 – 2009-08-19 18:14:44

5

現代的Java支持原語的自動裝箱,因此可以說

List<Integer> lst = new ArrayList<Integer>; 
lst.add(42); 

這至少可以避免新Integer(42)的句法醋。

+3

這是危險的(下面給出的原因) – 2009-08-19 18:10:23

+0

事實上 - Java集合的某些方法被重載,並且當涉及自動裝箱時,Java可能通過選擇非自動複製選項而不是生成編譯時錯誤來解決_conceptually_模糊的調用。從概念上講,其原因是int和Integer是同構的,但它們之間不存在子類型關係。這種關係在Java中並不存在,而是自動裝箱(以及泛型和類型刪除的一些深奧問題)。 – 2009-08-19 19:08:58

+2

新的整數(42)是錯誤的事情,使用Integer.valueOf(42)進行裝箱。 – starblue 2009-08-19 20:09:09

1

Eclipse Collections對於所有基元類型以及原始集合,袋子,堆棧和地圖都具有原始ArrayLists。所有基本容器類型都有不可變的版本。

注意:我是Eclipse集合的提交者。