Создать список примитивных int?

97

Есть ли способ создать список примитивов int или любых примитивов в java, как показано ниже?

List<int> myList = new ArrayList<int>();

Кажется, я могу List myList = new ArrayList();

и добавьте "int" в этот список. Но тогда это означало бы, что я могу добавить что угодно в этот список.

Есть ли у меня единственный вариант - создать массив int и преобразовать его в список или создать список объектов Integer?

Сюзи
источник
Если вас беспокоит производительность, вам может помочь Trove.
assylias 02 авг.13
Можно создать список, используя базовый массив, но вам нужно знать размер массива для начала, и вы потеряете множество других функций, которые поставляются с объектом Collections. Но вы можете сделать что-то вроде: int [] array = new int [10];
Тейлор

Ответы:

144

В Java тип любой переменной - это либо примитивный, либо ссылочный тип. Аргументы универсального типа должны быть ссылочными типами. Поскольку примитивы не расширяются, Objectих нельзя использовать в качестве аргументов универсального типа для параметризованного типа.

Вместо этого используйте Integerкласс, который является оболочкой для int:

List<Integer> list = new ArrayList<Integer>();

Если вы используете Java 7, вы можете упростить это объявление с помощью оператора ромба:

List<Integer> list = new ArrayList<>();

С автобоксингом в Java примитивный тип при необходимости intстановится типом Integer.

Автобоксирование - это автоматическое преобразование, которое компилятор Java выполняет между примитивными типами и соответствующими им классами-оболочками объектов.

Итак, верно следующее:

int myInt = 1;
List<Integer> list = new ArrayList<Integer>();
list.add(myInt);

System.out.println(list.get(0)); //prints 1
Кевин Бауэрсокс
источник
1
Итак, метод setSelectedIndices в JTable не имеет смысла: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez
25

Нет, нет никакой коллекции, которая может содержать примитивные типы, когда используется Java Collection Framework.

Однако есть и другие коллекции java, которые поддерживают примитивные типы, например: Trove , Colt , Fastutil , Guava.

Пример того, как будет выглядеть arrayylist с int при использовании библиотеки Trove:

 TIntArrayList list= new TIntArrayList();

Производительность этого списка по сравнению с ArrayList целых чисел из коллекций Java намного лучше, поскольку автоматическая упаковка / распаковка в соответствующий класс Integer Wrapper не требуется.

Майк Б.
источник
1
Я не смог найти реализацию примитивной коллекции в Guava. Не могли бы вы дать ссылку?
nimcap
9

Есть ли способ создать список примитивов int или любых примитивов в java

Нет, не можешь. Вы можете только создать список ссылочных типов, как Integer, Stringили пользовательский тип.

Кажется, я могу сделать List myList = new ArrayList();и добавить "int" в этот список.

Когда вы добавляете intв этот список, он автоматически упаковывается в Integerтип оболочки. Но использовать списки необработанных типов или любой общий тип в этом отношении в новом коде - плохая идея .

Я могу добавить что угодно в этот список.

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

Единственный вариант - создать массив int и преобразовать его в список

В этом случае вы также получите List<Integer>только. Нет никакого способа создать List<int>или примитивы.

В любом случае не стоит беспокоиться. Даже в List<Integer>вы можете добавить intпримитивные типы. Он будет автоматически помещен в рамку, как в примере ниже:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
Рохит Джайн
источник
Хорошее обсуждение сырого типа.
Кевин Бауэрсокс,
На самом деле, для ясности, вы можете создать список с примитивными типами, просто используя базовый массив. int [] массив = новый int [10];
Тейлор
1
@Taylor Но это не будет динамически увеличивающийся список. Это массив. И я предполагаю, что OP уже знал об этом.
Рохит Джайн
5

Это невозможно. Спецификация java запрещает использование примитивов в дженериках. Тем не менее, вы можете создавать ArrayList<Integer>и вызывать, add(i)если iэто int, благодаря боксу.

нанофарад
источник
4

Вы можете использовать примитивные коллекции, доступные в Eclipse Collections . Затмения коллекции есть List, Set, Bagи Mapдля всех примитивов. Элементы в примитивных коллекциях поддерживаются как примитивы, без упаковки.

Вы можете инициализировать IntList следующим образом:

MutableIntList ints = IntLists.mutable.empty();

Вы можете преобразовать из a List<Integer>в IntListследующее:

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);

Примечание: я участвую в Eclipse Collections.

Нихил Нанивадекар
источник
3

Коллекции используют универсальные шаблоны, которые поддерживают ссылочные типы или символы wildcards. Однако вы можете использовать Integerобертку

List<Integer> list = new ArrayList<>();
Реймеус
источник
0

При использовании Java для разработки под Android рекомендуется использовать SparseIntArrayдля предотвращения автобокса между intи Integer.

Вы можете найти дополнительную информацию SparseIntArrayв документации для разработчиков Android и хорошее объяснение для автобокса на Android, введите описание ссылки здесь

Стефан Медак
источник
Это сильное заявление. Конечно SparseIntArray, часто это лучший вариант, но есть компромиссы, о которых следует знать. «Реализация не предназначена для использования в структурах данных, которые могут содержать большое количество элементов. Обычно она медленнее, чем традиционная HashMap ...»
Энди Томас
Да, это правда. Они довольно хорошо освещают этот компромисс в видео, которое я связал. Но OP запросил эту конкретную возможность, и я просто хотел добавить, что это действительно возможно с Android, а также рекомендуется для большинства случаев использования. Спасибо, что добавили эту информацию!
Стефан Медак
0

Есть ли способ преобразовать массив Integer [] в массив int []?

Это грубое упущение из основных библиотек Java, кажется, встречается практически в каждом проекте, над которым я когда-либо работал. И сколь бы удобной ни была библиотека Trove, я не могу проанализировать точные требования для соответствия LPGL для приложения Android, которое статически связывает библиотеку LGPL (в преамбуле написано хорошо, тело, похоже, не говорит то же самое). И просто неудобно копировать и удалять исходные коды Apache, чтобы получить эти классы. Там должен быть лучший способ.

Робин Дэвис
источник
-4

Коллекция Java должна быть только коллекцией объектов.

List<Integer> integerList = new ArrayList<Integer>();

Целое число - это класс-оболочка примитивного типа данных int.

больше из классов оболочки JAVA здесь !

U может напрямую сохранять и получать int в / из integerList как, integerList.add(intValue); int intValue = integerList.get(i)

Сельварадж
источник
1
Первая строка не компилируется, а последние две строки кода везде. Пожалуйста, воздержитесь от этого.
The_Martian