2012-05-29 3 views
31

Я видел Java документ для ArrayList и обнаружил, что начальная мощность ArrayList является 10.Почему емкость ArrayList 10 по умолчанию?

/** 
* Constructs an empty list with an initial capacity of ten. 
*/ 
public ArrayList() { 
this(10); 
} 

Я думаю, что это имело бы смысл, если бы любая степень 2, но почему 10?

Я также проверил начальную емкость HashMap, и это имеет смысл.

/** 
* The default initial capacity - MUST be a power of two. 
*/ 
static final int DEFAULT_INITIAL_CAPACITY = 16; 

/** 
* Constructs an empty <tt>HashMap</tt> with the default initial capacity 
* (16) and the default load factor (0.75). 
*/ 
public HashMap() { 
    this.loadFactor = DEFAULT_LOAD_FACTOR; 
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); 
    table = new Entry[DEFAULT_INITIAL_CAPACITY]; 
    init(); 
} 

Есть ли какая-либо причина позади номера 10?

+15

>>> _it может сделать это, если бы это было сколько угодно силы 2_ почему? –

+4

Я думаю, что это восходит к доминирующей форме жизни в cs, которая, кажется, имеет два манипулятора с 5 цифрами на каждом.Те, которые используются для подсчета в первые дни вычислений. Поэтому они предпочитают полномочия 10 для всех видов вещей. –

+4

10 - это начальная емкость списка массивов, а не размер. Начальный размер всегда равен 0. – BOSS

ответ

35

ArrayList - это простой растущий массив. При попытке добавить элемент, а размер буфера превышен, он просто растет. Таким образом, начальный размер может быть любым положительным значением.

1 было бы слишком мало. Даже с несколькими элементами у нас будет несколько операций изменения размера.

100 будет потерять пространство.

Итак, 10 является компромиссом. Почему 10, а не 12 или 8? Первый намек на то, что типичные варианты использования были проанализированы, и это лучше всего подходит для потери производительности и потери пространства. Тем не менее, я думаю, увидев исходный код Солнца, что он не анализировался настолько глубоко, и это произвольное «не слишком маленькое, не слишком большое» число.

1

10, вероятно, является более или менее произвольным числом для числа элементов по умолчанию.

+1

Я не думаю, что разработчики солнца безумны, чтобы использовать любое случайное число в качестве номера по умолчанию, не задумываясь. Они должны были подумать о каком-то полезном и эффективном сценарии. –

5

Полностью произвольный выбор.

И нет причин, по которым сила-2 здесь имеет смысл. Это имеет смысл в HashMap, из-за того, как работает хеширование. Фактически, он должен быть мощностью двух (согласно комментарию в источнике).

Обратите внимание, что java.util.Vector (который является старшим братом ArrayList) также имеет 10.

+0

есть, это также. И может быть и причина для способности ArrayList. Но тогда возникает вопрос, почему начальная емкость вектора равна 10? –

13

для списка, нет никакого преимущества в том, способность быть степенью двойки. На самом деле, нет никакой реальной выгоды в какой-либо конкретной стартовой емкости. Он должен быть достаточно большим, чтобы избежать множественных шагов изменения размера для обычного случая с небольшими списками и достаточно мала, чтобы не тратить память на неиспользуемую емкость в этом же случае. 10, вероятно, был выбран просто потому, что он попадает в правильный диапазон для выполнения этих требований и потому, что он «круглый».

+1

Не может быть никакого реального преимущества для какой-либо конкретной мощности, даже если его мощность равна 2. Но тогда, если разработчики солнца сделали достаточно анализа большого количества сценариев, чтобы узнать какое-либо количество, они должны хотя бы поделиться им, может быть не в java doc, а в любом официальном блоге. Так что у всех в сообществе разработчиков есть идея, и другие программисты могут выразить свои взгляды, чтобы сделать этот первоначальный номер емкости более подходящим для реальных случаев использования в целях развития. –

+5

@Priyank Doshi: Вы можете переусердствовать над этим ... – Thilo

+3

@Priyank Doshi: Идеальная начальная степень может быть разной между приложениями, поэтому среднее значение по сравнению с большим количеством сценариев на самом деле не очень полезно - точное значение крайне маловероятно для большинства приложений, но для тех, где это имеет значение, вы захотите использовать лучшее значение для этого конкретного приложения, а не какое-то среднее. –

0

Если в коде нет комментариев, мы никогда не узнаем наверняка. Однако я полагаю, что в какой-то момент инженер Sun собрал статистику по использованию ArrayList в большом количестве реальных приложений и определил ... эмпирически ... что 10 дал примерно лучшие результаты в среднем. (Вот как они настраивают такие вещи, как оптимизатор, дизайн байт-кода и т. Д.)

И, и другие указали, что нет никакого вычислительного преимущества (или недостатка) при использовании размера, который является силой двух для размера ArrayList.

10

Vector от JDK 1.0 имеет начальную пропускную способность по умолчанию 10, поэтому, вероятно, имело смысл оставаться последовательным, когда они вводили ArrayList в 1.2.

+0

Нет. Это было бы несовместимым изменением. Javadoc, который является спецификацией, говорит, что емкость по умолчанию - 10, поэтому они не могут просто изменить ее. – Thilo

+3

@PriyankDoshi Я имею в виду, что они, вероятно, хотели, чтобы ArrayList оставался совместимым с Vector, так как они тесно связаны между собой. Не ссылаясь на другие реализации коллекции. –

Смежные вопросы