2009-08-19 3 views
20

Есть ли расширяемый класс массива в Java API, эквивалентный классу Vector или ArrayList, который может использоваться с примитивами (int, char, double и т. Д.)?Java Vector или ArrayList для примитивов

Мне нужен быстрый расширяемый массив для целых чисел, и кажется, расточительно их обернуть в класс Integer, чтобы использовать их с Vector или ArrayList. Мой google-fu терпит неудачу.

+5

+1 для «Мой google-fu не дает мне». – kevinarpe

ответ

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

Другими словами, используйте одну из сторонних библиотек или напишите свой собственный. Понял, спасибо! :) –

+9

+ 1 для удаления (4) remove (new Integer (4)) пример! – 2010-07-25 01:01:07

+2

** Примитивные коллекции для Java ** отмечены как удаленные на SourceForge. – Stephan

13

http://trove4j.sourceforge.net/

Библиотека Trove обеспечивает высокую скорость регулярные и примитивные коллекции для Java.

Обратите внимание, что поскольку Trove использует примитивы, типы, которые он определяет, не реализуют интерфейсы коллекции java.util.

(LGPL лицензия)

+0

Это для коммерческого развития программного обеспечения. Хотя я думаю, что мы сможем использовать код LGPL'd, который мне нужно будет проверять с людьми, и в этом случае было бы легче просто написать собственный класс. Я буду отмечать библиотеку для будущих материалов Open Source, которые я пишу, спасибо, спасибо! –

+0

Если LGPL не работает, это исключает очень большую долю библиотек с открытым исходным кодом. Что вы ожидали? – skaffman

+0

Просто нужно было знать, не пропало ли что-то в JDK. LGPL не является пределом, но я могу написать свой собственный класс в этом случае за меньшее время, чем потребовалось бы, чтобы получить доступ к библиотеке, интегрировать его и затем написать код, используя его. –

5

Современные Java поддерживает Autoboxing примитивов, так что вы можете сказать

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

Это, по крайней мере, позволяет избежать синтаксического уксуса нового Integer (42).

+3

Это опасно (причины приведены ниже) –

+0

Действительно - некоторые методы коллекций Java перегружены, и когда задействована автобоксинг, Java может разрешать вызовы, которые являются _conceptually_ неоднозначными, выбирая опцию без автобокса, а не генерируя ошибку времени компиляции , Понятно, что причиной этого является то, что int и Integer изоморфны, но между ними не существует отношения подтипа. Подобные отношения не существуют нигде в Java, но autoboxing (и несколько эзотерических проблем с дженериками и стиранием типов). –

+2

новый Integer (42) - это не то, что нужно сделать, используйте Integer.valueOf (42) для бокса. – starblue

1

Eclipse Collections имеет примитивные ArrayLists для всех примитивных типов, а также примитивные наборы, сумки, стеки и карты. Существуют также неизменные версии всех примитивных типов контейнеров.

Примечание: Я являюсь коммиттером для коллекций Eclipse.

Смежные вопросы