1

Java не позволяет нам напрямую создавать ArrayList примитивов. Но мы можем создать ArrayList класса оболочки примитивов.Показатели эффективности автобоксинга на ArrayList примитивных оберток

Но при доступе к примитивному значению компилятор автоматически выполняет упаковку и разворачивание. Разве это не накладные расходы? Мой вопрос - каковы последствия этого?

В таком случае не было бы int[] лучше, чем ArrayList<Integer>?

Кто-нибудь измерил производительность int[] против ArrayList<Inetger> за Java5.0 (когда это было впервые введено) и последние версии Java. Это было бы очень полезно для всех, кто столкнулся с этим вопросом, если бы вы могли поделиться результатами тестирования.

+0

массив и а 'list' имеют разные обычаи, и это часто не сводится к скорости при выборе между ними. Также важно знать, что под каждым 'ArrayList' находится массив. – Obicere

+2

Примитивный массив быстрее (нет двойного о нем), но 'List' (и любая коллекция вообще) удобнее для объектов. Таким образом, выбор за вами, но все, что вы делаете, не использует старый массив для открытого интерфейса. – MaxZoom

+0

@Obicere true. Я пытаюсь понять, если мы скомпрометируем производительность за небольшую гибкость. Это особенно важно, когда мы должны делать выбор между int [] и ArrayList Chiseled

ответ

3

Действительно, это добавляет некоторые накладные расходы. Если это проблема для вас, подумайте о том, чтобы использовать некоторую библиотеку, которая поддерживает коллекции примитивов из коробки. Например Trove, Guava или Google для другой библиотеки

0

A question был задан на ту же тему со следующими результатами тестов на 20 метров элементов int[] против ArrayList (который я повторно запустить на своем компьютере, от @Wsl_F вопроса):

public static void main(String[] args) { 
    int n = 20_000_000; 
    System.out.println("Warming up..."); 
    list(n); 
    array(n); 
    long t0 = System.nanoTime(); 
    int v = list(n); 
    t0 = System.nanoTime() - t0; 
    System.out.printf("list %.1f ms (%d)\n", (t0/1000000.0), v); 

    t0 = System.nanoTime(); 
    v = array(n); 
    t0 = System.nanoTime() - t0; 
    System.out.printf("array %.1f ms (%d)\n", (t0/1000000.0), v); 
} 

private static int list(int n) { 
    ArrayList<Integer> list = new ArrayList<>(n); 
    for (int i = 0; i < n; i++) 
     list.add(i); 
    return list.get(n/2); 
} 

private static int array(int n) { 
    int[] list = new int[n]; 
    for (int i = 0; i < n; i++) 
     list[i] = i; 
    return list[n/2]; 
} 

дает мне (Eclipse, на Ubuntu 16.04 x64 с процессором Intel Core i7):

list 1839,9 ms (10000000) 
array 515,9 ms (10000000) 
Смежные вопросы