1. Обзор
В этом уроке мы узнаем, как построить список, содержащий примитивные целочисленные значения .
Мы рассмотрим решения, использующие основную Java и внешние библиотеки.
2. Автобоксинг
В Java аргументы generic type должны быть ссылочными типами. Это означает, что мы не можем сделать что-то вроде List .
Вместо этого мы можем использовать List и воспользоваться преимуществами автобокса. Autoboxing помогает нам использовать интерфейс List , как если бы он содержал примитивные int значения. Под капотом по-прежнему находится коллекция Объектов , а не примитивов.
Основное решение Java – это просто настройка, позволяющая использовать примитивы с общими коллекциями . Кроме того, это связано с затратами на конвертацию в бокс и распаковку.
Однако в Java есть и другие опции и дополнительные сторонние библиотеки, которые мы можем использовать. Давайте посмотрим, как их использовать ниже.
3. Использование API потока
Часто на самом деле нам не нужно создавать список , нам просто нужно работать с ним.
В этих случаях может сработать использование Java 8 Stream API вместо создания списка в целом. Класс In stream предоставляет последовательность примитивных int элементов, которая поддерживает последовательные агрегатные операции.
Давайте быстро рассмотрим пример:
IntStream stream = IntStream.of(5, 10, 0, 2, -8);
Метод IntStream.of () |/static возвращает последовательный IntStream .
Аналогично, мы можем создать IntStream из существующего массива ints :
int[] primitives = {5, 10, 0, 2, -8}; IntStream stream = IntStream.of(primitives);
Кроме того, мы можем применить стандартные операции API потока для итерации, фильтрации и агрегирования ints . Например, мы можем вычислить среднее значение положительных значений int :
OptionalDouble average = stream.filter(i -> i > 0).average();
Самое главное, автобокс не используется при работе с потоками.
Хотя, если нам определенно нужен конкретный список, мы захотим взглянуть на одну из следующих сторонних библиотек.
4. Использование сокровищницы
Trove-это высокопроизводительная библиотека, которая предоставляет примитивные коллекции для Java .
Чтобы настроить Trove с Maven, нам нужно включить | trov4j зависимость в ваш pom.xml :
net.sf.trove4j trove4j 3.0.2
С помощью Trove мы можем создавать списки, карты и наборы.
Например, существует интерфейс Titleist с его TIntArrayList реализация для работы со списком значений int :
TIntList tList = new TIntArrayList();
Несмотря на то, что Titleist не может напрямую реализовать 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 является открытым исходным кодом, высокопроизводительной библиотекой для научных и технических вычислений . Пакет cern.colt содержит изменяемые по размеру списки, содержащие примитивные типы данных, такие как int .
Во-первых, давайте добавим colt зависимость :
colt colt 1.2.0
Примитивный список, предлагающий эту библиотеку, называется cern.colt.list.ИнтАррайЛист:
cern.colt.list.IntArrayList coltList = new cern.colt.list.IntArrayList();
Начальная емкость по умолчанию-десять.
7. Использование гуавы
Guava предоставляет ряд способов взаимодействия между примитивными массивами и API-интерфейсами коллекций . Пакет com.google.common.primitives содержит все классы для размещения примитивных типов.
Например, класс Immutable Int Array позволяет нам создать неизменяемый список элементов int .
Предположим, у нас есть следующий массив значений int :
int[] primitives = new int[] {5, 10, 0, 2};
Мы можем просто создать список с массивом:
ImmutableIntArray list = ImmutableIntArray.builder().addAll(primitives).build();
Кроме того, он предоставляет API-интерфейс списка со всеми стандартными методами, которые мы ожидаем.
8. Заключение
В этой краткой статье мы показали несколько способов создания списков с примитивными целыми числами . В наших примерах мы использовали библиотеки Trove, Fastutil, Colt и Guava .
Как обычно, полный код этой статьи доступен на GitHub .