Саволи стандартӣ ба миён меояд: чӣ гуна рӯйхатро оғоз кардан мумкин аст? Рамзи зер кор нахоҳад кард: Ин боиси хатогии тартибдиҳӣ мегардад: Номҳои тағирёбандаи маҳаллӣ шояд оғоз нашудаанд . Мушаххасоти Java талаб мекунад, ки ҳама тағирёбандаҳои маҳаллӣ (онҳое, ки дар стек мавҷуданд) бо арзишҳои мувофиқ оғоз карда шаванд. Ин аст, ки шумо ин корро карда метавонед: Бешубҳа, рӯйхат бояд оғоз карда шавад. Шумо метавонед ё рӯйхатро дар сатри аввал эҷод кунед, ё шумо метавонед кори оқилонатар иҷро кунед ва оғозкунии танбалро мисли мо дар усули getAllNames() истифода баред . Дар ин ҳолат, рӯйхат танҳо дар ҳолати зарурӣ сохта мешавад - агар шартҳои аввала риоя карда нашаванд, рӯйхат ҳеҷ гоҳ дар теппа пайдо намешавад. Дар ин ҷо мо ба саволи асосӣ мерасем: барои рӯйхат кадом андоза бояд муқаррар карда шавад? Беҳтарин вариант ин аст, ки ба ӯ андозаи дақиқ диҳад. Масалан: Дар ин ҳолат маҳз n ном бояд баргардонида шавад ва дар натиҷа коллексияи n элемент сохта мешавад. Аммо, арзиши дақиқи n на ҳама вақт маълум аст. Ҳатто дар мисоли овардашуда чӣ мешавад, агар n=1000 ва танҳо 100 ном мавҷуд бошад? Ҳангоми кор бо коллексияҳо усули маъмултарин даъват кардани конструктори пешфарз мебошад. Агар шумо ба codeи сарчашмаи Java назар кунед (versionи 1.6) Тавре ки шумо мебинед, ба таври нобаёнӣ рӯйхати 10 элемент сохта мешавад . Яъне, мо метавонем конструктори пешфарзро бехатар истифода барем, вақте ки мо зиёда аз 10 элементро дар рӯйхат нигоҳ доштан надорем. Агар шумо кӯшиш кунед, ки элементи 11-ро илова кунед, чӣ мешавад? Хуб, ҳеҷ чизи бад нест ... элемент бомуваффақият илова карда мешавад. Ба усул нигаред: Андозаи массив аз ҷониби усули таъминиCapacity идора карда мешавад . Андоза 1,5 баробар меафзояд . Массиви нав сохта мешавад ва элементҳо ба он интиқол дода мешаванд. Агар мо андозаро ба 10 муқаррар кунем, пас дар элементи 11:
public List
getAllNames() { List
names; if (/*необходимые условия выполнены*/) { names = new ArrayList
(); /*заполнение списка*/ } return names; }
List
names = null; List
names = new ArrayList
(); List
names = new ArrayList
(0); List
names = new ArrayList
(size);
public List
getTopNames (int n) { List
names = null; if ( /*необходимые условия выполнены*/) { names = new ArrayList
(n); /*заполнение списка*/ } return names; }
names = new ArrayList
();
/** * Конструирует пустой список с указанной начальной емкостью. * * @param initialCapacity начальная емкость списка * @exception IllegalArgumentException если указанная начальная емкость отрицательна * */ public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) this.elementData = new Object[initialCapacity]; } /** * Конструирует пустой список с начальной емкостью, равной 10. */ public ArrayList() { this(10); }
public Boolean add(E e) { ensureCapacity(size + 1); //увеличивает modCount!! elementData[size++] = e; return true; }
public void ensureCapacity (int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { throw new IllegalArgumentException(“Illegal Capacity: ” + initialCapacity); Object oldData[] = elementData; int newCapacity = (oldCapacity * 3) / 2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity обычно ближе к размеру, так что это беспроигрышно: elementData = Arrays.copyOf(elementData, newCapacity); } }
- андоза ба 10 * 3/2 + 1 = 16 тағир меёбад
- афзоиши навбатӣ = 16 * 3/2 + 1 = 25
- афзоиши навбатӣ = 25 * 3/2 + 1 = 39 ва ғайра.
- Коллексияро танҳо вақте ки ба шумо лозим аст , созед , вагарна онро ба сифр оғоз кунед ё Collections.EMPTY_LIST -ро истифода баред .
- Агар шумо андозаи дақиқи лозимиро донед , онро дар конструктори коллексия нишон диҳед.
- Агар шумо мутмаин бошед, ки шумораи элементҳо аз 10 зиёд нахоҳад буд , озодона аз созандаи пешфарз истифода баред.
- Хавфи марбут ба эҷоди коллексияи сифр дар он аст, ки басомади эҷоди массивҳои нав ва нусхабардории маълумот метавонад баландтар бошад. Шумо бояд бодиққат фикр кунед, ки оё фоидаи истифодаи коллексияҳои андозаи сифр дар ҳақиқат ин қадар бузург аст .
- Агар шумо коллексияро дар оғози усул хеле калон оғоз карда бошед ва мехоҳед онро кам кунед, усули trimToSize() мавҷуд аст .
GO TO FULL VERSION