JavaRush /Java блогу /Random-KY /new ArrayList(????) кантип жана кайда инициализациялоо жа...
Vovan
Деңгээл

new ArrayList(????) кантип жана кайда инициализациялоо жакшы

Группада жарыяланган
Коллекциялар алкагын колдонбостон code жазуу жинди болмок. Бул көптөгөн тыкан чечимдер менен Java сонун бөлүгү болуп саналат. Андан да маанилүүсү, массивдерден айырмаланып, сиз өлчөмдөр жөнүндө кабатырланбайсыз. ArrayList эс тутуму түгөнгөнгө чейин өсөт. Иштеп чыгуучунун баштапкы өлчөмү жана ArrayIndexOutOfBoundsException катасы жөнүндө тынчсыздануунун кереги жок . Бирок эстутумдун көлөмүн көзөмөлдөө үчүн шарт бар болсочы? Коллекциялар менен иштөөдө эстутумду эффективдүү колдоно алабызбы?
Стандарттуу суроо туулат: тизмени кантип инициализациялоо керек? Төмөнкү code иштебейт: Бул компиляция катасына алып келет: Жергorктүү өзгөрмө аттары инициализацияланган эмес болушу мүмкүн . Java спецификациясы бардык локалдык өзгөрмөлөрдү (стекте барлар) тиешелүү маанилер менен инициализациялоону талап кылат. Муну сиз ушундай кылсаңыз болот: Албетте, тизме инициализацияланышы керек. Тизмени биринчи сапта түзө аласыз, же сиз акылдуураак нерсени жасап, getAllNames() методундагыдай жалкоо инициализацияны колдонсоңуз болот . Бул учурда, тизме зарыл болгондо гана түзүлөт - эгерде баштапкы шарттар аткарылбаса, тизме эч качан үймөктө көрүнбөйт. Бул жерде биз негизги суроого келип: тизме үчүн кандай өлчөмүн коюу керек? Эң жакшы вариант - ага так өлчөмүн берүү. Мисалы: Бул учурда, так n аталышты кайтаруу керек жана натыйжада n элементтердин жыйындысы түзүлөт. Бирок, n так мааниси дайыма эле белгилүү боло бербейт. Келтирилген мисалда да, эгерде n=1000 жана 100 гана ысым бар болсочы? Коллекциялар менен иштөөдө эң популярдуу ыкма - демейки конструкторду чакыруу. Эгер сиз Java булак codeун карасаңыз (version 1.6) Көрүнүп тургандай, демейки боюнча 10 элементтен турган тизме түзүлөт . Башкача айтканда, биз тизмеде 10дон ашык элементти сактоону пландабаганыбызда демейки конструкторду коопсуз колдоно алабыз. 11-элементти кошууга аракет кылсаңыз эмне болот? Ооба, эч кандай жаман нерсе жок ... элемент ийгorктүү кошулат. Методду караңыз: Массивдин өлчөмү sureCapacity ыкмасы менен көзөмөлдөнөт . өлчөмү 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 бир нече жолу жаңы массив түзүп, ага элементтерди көчүрүү керек болот. Муну эске алуу менен, массивдин керектүү өлчөмү жөнүндө божомол бар болсо, ага жакын баштапкы кубаттуулукту коюу жакшы. Бул жерде иш-аракет үчүн кээ бир көрсөтмөлөр бар:
  1. Коллекцияны сизге керек болгондо гана түзүңүз , антпесе аны null кылып инициализациялаңыз же Collections.EMPTY_LIST колдонуңуз .
  2. Эгер сиз талап кылынган так өлчөмдү билсеңиз , аны коллекциянын конструкторунда көрсөтүңүз.
  3. Эгерде сиз элементтердин саны 10дон ашпасына ишенсеңиз , демейки конструкторду колдонуңуз.
  4. Нөл өлчөмдөгү коллекцияны түзүү менен байланышкан тобокелдик жаңы массивдерди түзүү жана маалыматтарды көчүрүү жыштыгы жогору болушу мүмкүн. Сиз нөл өлчөмүндөгү коллекцияларды колдонуунун пайдасы чындап эле чоңбу же жокпу, аны жакшылап ойлонушуңуз керек .
  5. Эгер сиз коллекцияны методдун башында өтө чоң инициализациялаган болсоңуз жана аны азайткыңыз келсе, trimToSize() ыкмасы бар .
Албетте, бул көрсөтмөлөр массивге негизделген коллекциялар менен иштөөдө колдонулат жана алардын бири да байланышкан тизмеде мааниси жок. Чынында, бул көйгөйлөр программанын өлтүргүч болушу күмөн, бирок бир аз жакшыраак кылууга мүмкүнчүлүк болсо, эмне үчүн аны колдонбойт. Башка пайдалуу кеңештериңиз барбы? Ишти жакшыртуунун жолдорун таптыңызбы? Же мунун баары керексизби? Сиз кандай ойлойсуз?
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION