JavaRush /Блоги Java /Random-TG /new ArrayList(????) чӣ гуна ва дар куҷо оғоз кардан беҳта...
Vovan
Сатҳи

new ArrayList(????) чӣ гуна ва дар куҷо оғоз кардан беҳтар аст

Дар гурӯҳ нашр шудааст
Навиштани code бе истифодаи чаҳорчӯбаи коллексияҳо девона мебуд. Ин як порчаи олиҷаноби Java бо бисёр қарорҳои тоза аст. Муҳимтар аз ҳама, бар хилофи массивҳо, шумо набояд дар бораи андоза хавотир шавед. ArrayList то он даме, ки хотира тамом нашавад, афзоиш хоҳад ёфт. Таҳиягар набояд дар бораи андозаи ибтидоӣ ва хатогии ArrayIndexOutOfBoundsException хавотир шавад . Аммо чӣ мешавад, агар шарт барои назорат кардани миқдори хотира вуҷуд дошта бошад? Оё мо метавонем ҳангоми кор бо коллексияҳо хотираро самаранок истифода барем?
Саволи стандартӣ ба миён меояд: чӣ гуна рӯйхатро оғоз кардан мумкин аст? Рамзи зер кор нахоҳад кард: Ин боиси хатогии тартибдиҳӣ мегардад: Номҳои тағирёбандаи маҳаллӣ шояд оғоз нашудаанд . Мушаххасоти 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 ва ғайра.
Дар ҳолати 100 элемент, JVM бояд якчанд маротиба массиви нав эҷод кунад ва элементҳоро ба он нусхабардорӣ кунад. Бо назардошти ин, агар дар бораи андозаи зарурии массив тахмин вуҷуд дошта бошад, беҳтар аст, ки қобorяти ибтидоӣ ба он наздик карда шавад. Инҳоянд чанд роҳнамо барои амал:
  1. Коллексияро танҳо вақте ки ба шумо лозим аст , созед , вагарна онро ба сифр оғоз кунед ё Collections.EMPTY_LIST -ро истифода баред .
  2. Агар шумо андозаи дақиқи лозимиро донед , онро дар конструктори коллексия нишон диҳед.
  3. Агар шумо мутмаин бошед, ки шумораи элементҳо аз 10 зиёд нахоҳад буд , озодона аз созандаи пешфарз истифода баред.
  4. Хавфи марбут ба эҷоди коллексияи сифр дар он аст, ки басомади эҷоди массивҳои нав ва нусхабардории маълумот метавонад баландтар бошад. Шумо бояд бодиққат фикр кунед, ки оё фоидаи истифодаи коллексияҳои андозаи сифр дар ҳақиқат ин қадар бузург аст .
  5. Агар шумо коллексияро дар оғози усул хеле калон оғоз карда бошед ва мехоҳед онро кам кунед, усули trimToSize() мавҷуд аст .
Албатта, ин дастурҳо ҳангоми кор бо коллексияҳои массив истифода мешаванд ва ҳеҷ яке аз инҳо дар мавриди рӯйхати алоқаманд маъно надоранд. Дарвоқеъ, ин мушкилот қотилони барнома нестанд, аммо агар имкони каме беҳтар кор кардан вуҷуд дошта бошад, чаро аз он истифода набаред. Оё шумо дигар маслиҳатҳои муфид доред? Оё шумо роҳҳои беҳтар кардани корҳоро ёфтед? Ё ин ҳама нолозим аст? Ту чӣ фикр мекунӣ?
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION