Создать список примитивных 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.