Java中原始数据类型的Vector或ArrayList?

24

Java API中是否有与VectorArrayList类相当的可用于基本类型(int、char、double等)的可扩展数组类?

我需要一个快速的可扩展整数数组,似乎必须将它们包装在Integer类中才能与VectorArrayList一起使用,这似乎很浪费。我的谷歌搜索无果。


5
+1 表示“赞同”,而“My google-fu is failing me.”是指在使用谷歌搜索时遇到了难以解决的问题。 - kevinarpe
5个回答

37

很不幸,Java API中没有这样的类。但是有一个第三方产品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!

这也是访问(可能通过Map)神秘的NullPointerExceptions的常见来源:

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

2
换句话说,使用第三方库之一或编写自己的库。明白了,谢谢! :) - Daniel Bingham
13
感谢您对 remove(4) 和 remove(new Integer(4)) 的示例点赞! - functional
2
“Primitive Collections for Java” 已被标记为在 SourceForge 上删除。 - Stephan
@oxbow_lakes 为什么 l.remove 会抛出错误?这背后的原因是什么? - Ayushi Jain
只是为了澄清,在第int i = m.get("Helo Misspelt");行抛出的NullPointerException并不是因为get()方法在Map中找不到键,而是由于自动拆箱尝试将Integer值分配给原始的int时发生的。Integer i = m.get("Helo Misspelt");不会抛出NullPointerException - Roshana Pitigala
显示剩余2条评论

13

http://trove4j.sourceforge.net/

Trove库为Java提供了高速的常规和原始集合。

请注意,由于Trove使用基元类型,它定义的类型不实现java.util集合接口。

(LGPL许可证)


这是用于商业软件开发。虽然我认为我们可以使用LGPL的代码,但我需要与相关人员核实,如果是这种情况,编写自己的类可能会更容易些。不过,我会记下这个库,以备将来编写的开源项目中使用,谢谢! - Daniel Bingham
如果LGPL是禁区,那就排除了很大一部分开源库。你原本期望的是什么? - skaffman
只是想知道我是否在JDK中漏掉了什么。LGPL并不是禁止使用的,但在这种情况下,我可以自己编写类,比获得库的批准、将其集成,然后编写使用它的代码所需的时间更短。 - Daniel Bingham

6

现代Java支持原始类型的自动装箱,因此您可以这样说:

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

至少这样避免了使用new Integer(42)的语法上的不便。


3
这很危险(以下是原因) - oxbow_lakes
确实,Java集合的某些方法是重载的,当涉及到自动装箱时,Java可能通过选择非自动装箱选项而不是生成编译时错误来解决概念上模糊的调用。从概念上讲,这是因为int和Integer是同构的,但它们之间不存在子类型关系。这种关系在Java中除了自动装箱(以及一些与泛型和类型擦除有关的鲜为人知的问题)之外不存在于任何其他地方。 - Thom Smith
2
使用new Integer(42)是错误的,应该使用Integer.valueOf(42)进行装箱。 - starblue
自动装箱的好处是我不必记住那个。;-) - Thom Smith
我之前从未听说过"语法醋"这个词。迫不及待想要使用它。谢谢! - delrocco

5

2

Eclipse Collections拥有所有原始类型的原始ArrayList,以及原始Set、Bag、Stack和Map。同时也有所有原始容器类型的不可变版本。

注意:我是Eclipse Collections的提交者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接