Створити список примітивних int?


97

Чи є спосіб створити список примітивних int або будь-яких примітивів у Java, як показано нижче?

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

Здається, я можу це зробити List myList = new ArrayList();

та додайте "int" у цей список. Але тоді це означало б, що я можу додати що завгодно до цього списку.

Це мій єдиний варіант - створити масив int та перетворити його на список або створити список об’єктів Integer?


Якщо вас турбує продуктивність, Trove повинен допомогти.
assylias

Можна створити список, використовуючи базовий масив, але для початку потрібно знати розмір масиву, і ви втратите багато інших функціональних можливостей, що постачаються з об’єктом 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
Отже, метод JTable setSelectedIndices є безглуздим: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez

25

Ніякої колекції, яка може містити примітивні типи, використовується Java Collection Framework.

Однак існують інші колекції Java, які підтримують примітивні типи, такі як: Trove , Colt , Fastutil , Guava

Прикладом того, як був би арраїл з ints, коли використовувалася бібліотека Trove, є наступний:

 TIntArrayList list= new TIntArrayList();

Ефективність цього списку у порівнянні з ArrayList of Integers from Java Collections набагато краща, оскільки автопакування / розпакування до відповідного класу Integer Wrapper не потрібні.


1
Я не зміг знайти примітивну реалізацію колекції в Гуаві. Ви можете надати посилання, будь ласка?
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 вже знав би про це.
Rohit Jain


5

Це неможливо. Специфікація Java забороняє використовувати примітиви в дженериках. Тим не менш, ви можете створювати ArrayList<Integer>та дзвонити, add(i)якщо iце int, завдяки боксу.


4

Ви можете використовувати примітивні колекції, доступні в колекціях Eclipse . Затемнення колекції є 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.


3

Колекції використовують загальні засоби, які підтримують або еталонні типи, або wilcards. Однак ви можете використовувати Integerобгортку

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

0

Коли ви використовуєте Java для розробки Android, рекомендується використовувати SparseIntArrayдля запобігання автобоксу між intта Integer.

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


Це вагоме твердження. Звичайно SparseIntArray, часто кращий варіант, але є компроміси, про які слід пам’ятати. "Реалізація не має на меті відповідати структурам даних, які можуть містити велику кількість елементів. Як правило, це повільніше, ніж традиційна HashMap ..."
Енді Томас,

Так, це правда. Вони досить добре висвітлюють цей компроміс у відео, яке я посилав. Але ОП попросив цю особливу можливість, і я просто хотів додати, що це насправді можливо з Android, а також рекомендується для більшості випадків використання. Дякуємо, що додали цю інформацію!
Стефан Медак

0

Чи є спосіб перетворити масив Integer [] на масив int []?

Цей грубий пропуск основних бібліотек Java, здається, придумується майже для кожного проекту, над яким я коли-небудь працював. І як би зручно не було бібліотекою Trove, я не можу проаналізувати точні вимоги, щоб задовольнити LPGL для додатка Android, який статично пов'язує бібліотеку LGPL (преамбула каже "добре", здається, тіло не говорить те саме). І просто незручно відвідувати джерела Apache, які розривають і зачищають, щоб отримати ці класи. Повинен бути кращий спосіб.


-4

Колекція Java повинна бути колекцією лише об’єкта.

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

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

більше з класів обгортки JAVA тут !

Ви можете безпосередньо зберігати та отримувати int до / з integerList як, integerList.add(intValue); int intValue = integerList.get(i)


1
Перший рядок не компілюється, а останні два рядки коду є скрізь. Будь ласка, утримайтеся від цього.
The_Martian
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.