Перейти к основному содержимому

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

· 4 мин. чтения

1. Обзор

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

Мы рассмотрим решения, использующие ядро Java и внешние библиотеки.

2. Автобокс

В Java аргументы универсального типа должны быть ссылочными типами. Это означает, что мы не можем сделать что-то вроде List<int> .

Вместо этого мы можем использовать List<Integer> и использовать автоупаковку. Автоупаковка помогает нам использовать интерфейс List<Integer> так, как если бы он содержал примитивные значения типа int . Под капотом это по-прежнему набор объектов , а не примитивов.

Базовое решение Java — это всего лишь приспособление, позволяющее использовать примитивы с универсальными коллекциями . Кроме того, это связано со стоимостью конвертации упаковки и распаковки.

Однако в Java есть другие варианты и дополнительные сторонние библиотеки, которые мы можем использовать. Давайте посмотрим, как их использовать ниже.

3. Использование потокового API

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

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

Давайте быстро рассмотрим пример:

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

Статический метод IntStream.of () возвращает последовательный IntStream .

Точно так же мы можем создать IntStream из существующего массива целых чисел :

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

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

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

Самое главное, что при работе с потоками не используется автобокс .

Хотя, если нам определенно нужен конкретный список, мы захотим взглянуть на одну из следующих сторонних библиотек.

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

Trove — это высокопроизводительная библиотека, предоставляющая примитивные коллекции для Java .

Чтобы настроить Trove с Maven, нам нужно включить зависимость trov4j в наш pom.xml :

<dependency>
<groupId>net.sf.trove4j</groupId>
<artifactId>trove4j</artifactId>
<version>3.0.2</version>
</dependency>

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

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

TIntList tList = new TIntArrayList();

Несмотря на то, что TIntList не может напрямую реализовать List , его методы очень сопоставимы. Другие решения, которые мы обсуждаем, следуют аналогичному шаблону.

Самым большим преимуществом использования TIntArrayList является увеличение производительности и потребления памяти . Никакой дополнительной упаковки/распаковки не требуется, так как данные хранятся внутри массива int[] .

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

Еще одна высокопроизводительная библиотека для работы с примитивами — Fastutil . Добавим зависимость fastutil :

<dependency>
<groupId>it.unimi.dsi</groupId>
<artifactId>fastutil</artifactId>
<version>8.1.0</version>
</dependency>

Теперь мы готовы его использовать:

IntArrayList list = new IntArrayList();

Конструктор по умолчанию IntArrayList() внутренне создает массив примитивов с емкостью по умолчанию 16 . Точно так же мы можем инициализировать его из существующего массива:

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

6. Использование Кольта

Colt — это высокопроизводительная библиотека с открытым исходным кодом для научных и технических вычислений . Пакет cern.colt содержит списки изменяемого размера, содержащие примитивные типы данных, такие как int .

Во-первых, давайте добавим зависимость colt :

<dependency>
<groupId>colt</groupId>
<artifactId>colt</artifactId>
<version>1.2.0</version>
</dependency>

Список примитивов, который предлагает эту библиотеку, — cern.colt.list.IntArrayList:

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

Начальная емкость по умолчанию равна десяти.

7. Использование гуавы

Guava предоставляет несколько способов взаимодействия между примитивными массивами и API коллекций . В пакете com.google.common.primitives есть все классы для размещения примитивных типов.

Например, класс 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 .