Списък на примитивни целочислени стойности в Java

1. Общ преглед

В този урок ще научим как да изградим списък, съдържащ примитивни цели числа .

Ще проучим решения, използвайки основната Java и външни библиотеки.

2. Автобокс

В Java общите аргументи на типа трябва да бъдат референтни типове. Това означава, че не можем да направим нещо като Списък .

Вместо това можем да използваме Списък и да се възползваме от автобоксирането. Автобоксирането ни помага да използваме интерфейса List , сякаш съдържа примитивни int стойности. Под капака все още е колекция от обекти, а не примитиви.

Основното Java решение е само корекция, за да може да се използват примитиви с общи колекции. Нещо повече, това идва с разходите за конвертиране на бокс и разопаковане.

Има обаче други опции в Java и допълнителни библиотеки на трети страни, които можем да използваме. Нека да видим как да ги използваме по-долу.

3. Използване на Stream API

Често всъщност не е нужно да създаваме списък толкова, колкото просто трябва да го оперираме.

В тези случаи може да работи използването на Stream API на Java 8, вместо изобщо да се създаде списък. Класът IntSream осигурява поредица от примитивни int елементи, които поддържат последователни агрегирани операции.

Нека да разгледаме набързо един пример:

IntStream stream = IntStream.of(5, 10, 0, 2, -8);

В IntStream.of () статичен метод връща последователно IntStream .

По същия начин можем да създадем IntStream от съществуващ масив от ints :

int[] primitives = {5, 10, 0, 2, -8}; IntStream stream = IntStream.of(primitives);

Освен това можем да приложим стандартните операции на API на Stream за итерация, филтриране и агрегиране на ints . Например можем да изчислим средната стойност на положителните int стойности:

OptionalDouble average = stream.filter(i -> i > 0).average();

Най-важното е, че не се използва автобокс, докато работите с потоците.

Въпреки това, ако определено се нуждаем от конкретен списък, ще искаме да разгледаме една от следните библиотеки на трети страни.

4. Използване на Trove

Trove е библиотека с висока производителност, която предоставя примитивни колекции за Java .

За да настроим Trove с Maven, трябва да включим зависимостта trov4j в нашия pom.xml :

 net.sf.trove4j trove4j 3.0.2 

С Trove можем да създаваме списъци, карти и набори.

Например, има интерфейс TIntList с неговата реализация TIntArrayList, който да работи със списък с int стойности:

TIntList tList = new TIntArrayList();

Въпреки че TIntList не може директно да внедри List , методите му са много сравними. Други решения, които обсъждаме, следват подобен модел.

Най-голямата полза от използването на TIntArrayList е повишаване на производителността и потреблението на памет . Не е необходимо допълнително боксиране / разопаковане, тъй като съхранява данните в масива int [] .

5. Използване на Fastutil

Друга високоефективна библиотека за работа с примитивите е Fastutil. Нека добавим зависимостта fastutil :

 it.unimi.dsi fastutil 8.1.0 

Сега сме готови да го използваме:

IntArrayList list = new IntArrayList();

Конструкторът по подразбиране IntArrayList () вътрешно създава масив от примитиви с капацитет по подразбиране 16 . В същия дух можем да го инициализираме от съществуващ масив:

int[] primitives = new int[] {5, 10, 0, 2, -8}; IntArrayList list = new IntArrayList(primitives);

6. Използване на Colt

Colt е отворен код, високоефективна библиотека за научни и технически изчисления . Пакетът cern.colt съдържа променливи списъци, съдържащи примитивни типове данни като int .

Първо, нека добавим зависимостта на colt :

 colt colt 1.2.0 

Примитивният списък, който предлага тази библиотека, е cern.colt.list.IntArrayList:

cern.colt.list.IntArrayList coltList = new cern.colt.list.IntArrayList();

Първоначалният капацитет по подразбиране е десет.

7. Използване на Гуава

Guava предоставя редица начини за взаимодействие между примитивни масиви и API за събиране . Пакетът com.google.common.primitive има всички класове, за да побере примитивни типове.

Например класът ImmutableIntArray ни позволява да създадем неизменим списък с int елементи.

Да предположим, че имаме следния масив от стойности int :

int[] primitives = new int[] {5, 10, 0, 2};

Можем просто да създадем списък с масива:

ImmutableIntArray list = ImmutableIntArray.builder().addAll(primitives).build();

Освен това той предоставя API на списък с всички стандартни методи, които бихме очаквали.

8. Заключение

В тази бърза статия показахме множество начини за създаване на списъци с примитивните цели числа . В нашите примери използвахме библиотеките Trove, Fastutil, Colt и Guava .

Както обикновено, пълният код за тази статия е достъпен в GitHub.