Java API中是否有与Vector
或ArrayList
类相当的可用于基本类型(int、char、double等)的可扩展数组类?
我需要一个快速的可扩展整数数组,似乎必须将它们包装在Integer
类中才能与Vector
或ArrayList
一起使用,这似乎很浪费。我的谷歌搜索无果。
Java API中是否有与Vector
或ArrayList
类相当的可用于基本类型(int、char、double等)的可扩展数组类?
我需要一个快速的可扩展整数数组,似乎必须将它们包装在Integer
类中才能与Vector
或ArrayList
一起使用,这似乎很浪费。我的谷歌搜索无果。
很不幸,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
int i = m.get("Helo Misspelt");
行抛出的NullPointerException
并不是因为get()
方法在Map
中找不到键,而是由于自动拆箱尝试将Integer
值分配给原始的int
时发生的。Integer i = m.get("Helo Misspelt");
不会抛出NullPointerException
。 - Roshana Pitigalahttp://trove4j.sourceforge.net/
Trove库为Java提供了高速的常规和原始集合。
请注意,由于Trove使用基元类型,它定义的类型不实现java.util集合接口。
(LGPL许可证)
现代Java支持原始类型的自动装箱,因此您可以这样说:
List<Integer> lst = new ArrayList<Integer>;
lst.add(42);
至少这样避免了使用new Integer(42)的语法上的不便。
Eclipse Collections拥有所有原始类型的原始ArrayList,以及原始Set、Bag、Stack和Map。同时也有所有原始容器类型的不可变版本。
注意:我是Eclipse Collections的提交者。