Java Vector или ArrayList для примитивов
Существует ли расширяемый класс массива в Java API, эквивалентный классу Vector
или ArrayList
, который может использоваться с примитивами (int, char, double и т.д.)?
Мне нужен быстрый расширяемый массив для целых чисел, и кажется бесполезным обернуть их в класс Integer
, чтобы использовать их с Vector
или ArrayList
. Мой google-fu терпит неудачу.
Ответы
Ответ 1
К сожалению, нет такого класса, по крайней мере, в 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!
И это также общий источник таинственного доступа NullPointerExceptions
(возможно, через Map
):
Map<String, Integer> m = new HashMap<String, Integer>();
m.put("Hello", 5);
int i = m.get("Helo Misspelt"); //will throw a NullPointerException
Ответ 2
http://trove4j.sourceforge.net/
Библиотека Trove обеспечивает высокую скорость регулярные и примитивные коллекции для Java.
Обратите внимание, что поскольку Trove использует примитивы, типы, которые он определяет, не реализуют интерфейсы коллекции java.util.
(лицензия LGPL)
Ответ 3
Йода-Примитивы.
Существует также Primitive Collections для Java, но она немного устарела.
Ответ 4
Современная Java поддерживает автобоксирование примитивов, поэтому вы можете сказать
List<Integer> lst = new ArrayList<Integer>;
lst.add(42);
Это, по крайней мере, позволяет избежать синтаксического уксуса нового Integer (42).
Ответ 5
Eclipse Collections содержит примитивные ArrayLists для всех примитивных типов, а также примитивные наборы, пакеты, стеки и карты. Существуют также неизменные версии всех примитивных типов контейнеров.
Примечание. Я являюсь коммиттером для коллекций Eclipse.