JavaRush /Блоги Java /Random-TG /10 Саволҳои беҳтарин дар бораи коллексияҳо дар Java
FedoraLinux
Сатҳи
Москва

10 Саволҳои беҳтарин дар бораи коллексияҳо дар Java

Дар гурӯҳ нашр шудааст
Ин мақола тарҷумаи мақолаи " 10 саволҳои беҳтарин дар бораи коллексияҳои Java " мебошад . Дар зер саволҳои маъмултарин дар бораи коллексияҳо дар Java оварда шудаанд, ки дар Stackowerflow дода ва муҳокима карда мешаванд. Пеш аз он ки шумо ба ин саволҳо нигаред, хуб мебуд, ки ба диаграммаи иерархияи синф назар кунед. 1. Кай ба ҷои ArrayList LinkedList-ро истифода бурдан мумкин аст? ArrayList воқеан массив аст; ба унсурҳои он мустақиман тавассути индекс дастрас шудан мумкин аст. Агар массив аз ҳад зиёд пур шавад, массиви нав бо фазои бештар лозим мешавад. Ҷойгир кардан ва интиқол додани ҳамаи элементҳо вақти O(n) мегирад. Инчунин, илова ва хориҷ кардани элементҳо барои интиқол додани унсурҳои мавҷуда дар массив зарур аст. Ин шояд бузургтарин нороҳатии истифодаи ArrayList бошад. LinkedList рӯйхати дукаратаи пайвандҳои элементҳост. Ҳамин тариқ, барои дастрасӣ ба элемент дар марказ, шумо бояд аз аввал то охири варақ ҷустуҷӯ кунед. Аз тарафи дигар, илова ва хориҷ кардани элемент дар LinkedList тезтар аст, зеро ин амалҳо танҳо худи рӯйхатро тағир медиҳанд. Вақтҳои бадтарин дар зер муқоиса карда мешаванд:
Усул Рӯйхати массив Рӯйхати пайвандшуда
гирифтан (индекс) О(1) О(н)
илова (Д) О(н) О(1)
илова кардан (E, индекс) О(н) О(н)
хориҷ кардан (индекс) О(н) О(н)
Iterator.remove() О(н) О(1)
Iterator.add(E) О(н) О(1)
Сарфи назар аз вақти корӣ, истифодаи хотира бояд барои рӯйхатҳои калон алоҳида баррасӣ карда шавад. Дар LinkedList, ҳар як гиреҳ бояд ҳадди аққал ду нишондиҳандаи иловагӣ дошта бошад, то гиреҳҳои қаблӣ ва ояндаро пайваст кунад, дар ҳоле ки дар ArrayList танҳо массиви элементҳо лозим аст. Муқоисаи бештари рӯйхатҳои ArrayList, LinkedList ва Vector . 2. Эквиваленти муассир барои нест кардани элементҳо ҳангоми такрори коллексия Ягона роҳи дурусти тағир додани (нест кардани элементҳо) коллексия ҳангоми такрор ин истифодаи Iterator.remove() мебошад . Масалан: Хатогии маъмултарин ин аст: Ҳангоми иҷро кардани codeи боло шумо ConcurrentModificationException мегиред . Ин аз он сабаб рӯй медиҳад, ки итератор барои ҳаракат дар тамоми рӯйхат тавлид шудааст, аммо дар айни замон варақ тавассути занги Iterator.remove () тағир дода мешавад. Тавре ки дар ҳуҷҷатҳо барои ин истисно навишта шудааст, Iterator itr = list.iterator(); while(itr.hasNext()) { // do something itr.remove(); } for(Integer i: list) { list.remove(i); }
"ба як ришта тағир додани коллексия дар ҳоле ки риштаи дигар дар болои он такрор мешавад, умуман ҷоиз нест."
Умуман, барои як ришта тағир додани коллексия дар ҳоле ки риштаи дигар аз он мегузарад, қобor қабул нест. 3. Чӣ тавр Рӯйхатро ба массиви int[] табдил додан мумкин аст? Роҳи осонтарини ин кор ин истифодаи ArrayUtils аст , ки дар китобхонаи Apache Commons Lang ҷойгир аст . int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0])); Дар JDK миёнабур барои ин ифода вуҷуд надорад. Дар хотир доред, ки шумо наметавонед List.toArray() -ро истифода баред, зеро ин ифода Рӯйхатро ба бутун[] табдил медиҳад (ки навъи ибтидоӣ нест ). Роҳи дуруст ин вариант хоҳад буд: int[] array = new int[list.size()]; for(int i=0; i < list.size(); i++) { array[i] = list.get(i); } 4. Чӣ тавр массиви int[]-ро ба Рӯйхат табдил додан мумкин аст? Роҳи осонтарин ин инчунин истифодаи ArrayUtils дар китобхонаи Apache Commons Lang аст , тавре ки дар боло. List list = Arrays.asList(ArrayUtils.toObject(array)); Инчунин, дар JDK миёнабур барои ин ифода вуҷуд надорад. 5. Роҳи беҳтарини филтр кардани коллексия кадом аст? Шумо метавонед бастаҳои тарафи сеюмро ба монанди Guava ё Apache Commons Lang барои баланд бардоштани функсия истифода баред. Ҳардуи ин бастаҳо усули filter() доранд (дар синфи Collections2 аз Guava ва CollectionUtils аз Apache). Усули filter() унсурҳоеро бармегардонад, ки ба Predicate додашуда мувофиқат мекунанд. Дар JDK ҳама чиз мураккабтар аст. Хабари хуш ин аст, ки предикатҳо дар Java 8 илова карда мешаванд , аммо ҳоло ба шумо лозим аст, ки Iterator-ро барои такрори тамоми коллексия истифода баред. Албатта, шумо метавонед бо шиносоӣ бо интерфейси нави Predicate ба роҳе, ки Guava ва Apache пайравӣ мекунанд, тақлид кунед. Акнун мо метавонем codeи зеринро барои филтр кардани коллексия истифода барем: 6. Чӣ тавр ба осонӣ Рӯйхатро ба Set табдил додан мумкин аст? Вобаста аз он, ки шумо баробариро чӣ гуна муайян кардан мехоҳед, ду роҳи ин кор вуҷуд дорад. Қисми якуми code рӯйхатро ба HashSet мегузорад. Дубликат дар ин ҳолат асосан аз ҷониби hashCode () муайян карда мешавад. Одатан, ин кор хоҳад кард. Аммо агар шумо бояд роҳи муқоисаро ба назар гиред, беҳтар мебуд, ки қисми дуюми codeро истифода баред, ки дар он шумо муқоисагари худро муайян карда метавонед. 7. Чӣ тавр ман метавонам элементҳои такрориро аз ArrayList хориҷ кунам? Ин савол то андозае ба саволи боло алоқаманд аст. Агар тартиби элементҳо дар ArrayList барои шумо аҳамият надиҳад, як иқдоми оқилона ин аст, ки варақро дар Маҷмӯа барои нест кардани такрорӣ ҷойгир кунед ва сипас онро ба Рӯйхат баргардонед. Дар поён як мисол оварда шудааст. Агар тартиби элементҳо барои шумо муҳим бошад, пас фармоишро тавассути ҷойгир кардани рӯйхат дар LinkedHashSet , ки дар JDK стандартӣ аст, таъмин кардан мумкин аст. 8. Маҷмӯаи мураттабшуда int[] array = {1,2,3,4,5}; List list = new ArrayList (); for(int i: array) { list.add(i); } Iterator itr = list.iterator(); while(itr.hasNext()) { int i = itr.next(); if (i > 5) { // filter all ints bigger than 5 itr.remove(); } } public interface Predicate { boolean test(T o); } public static void filter(Collection collection, Predicate predicate) { if ((collection != null) && (predicate != null)) { Iterator itr = collection.iterator(); while(itr.hasNext()) { T obj = itr.next(); if (!predicate.test(obj)) { itr.remove(); } } } } filter(list, new Predicate () { public boolean test(Integer i) { return i <= 5; } }); Set set = new HashSet (list); Set set = new TreeSet (aComparator); set.addAll(list); ArrayList** list = ... // initial a list with duplicate elements Set set = new HashSet (list); list.clear(); list.addAll(set); Якчанд роҳҳо барои дастгирии коллексияи мураттабшуда дар Java мавҷуданд. Ҳамаи онҳо коллексияро бо тартиби табиӣ ё бо муқоисаи муайян таъмин мекунанд. Дар ҳолати тартиби табиӣ, шумо инчунин бояд интерфейси муқоисашавандаро дар элемент татбиқ кунед.
  1. Collections.sort() метавонад Рӯйхатро ҷудо кунад. Тавре ки дар ҳуҷҷатҳои Java гуфта шудааст, ин навъ устувор аст ва иҷрои n log(n)-ро кафолат медиҳад.
  2. PriorityQueue навбати тартибро таъмин мекунад. Фарқи байни PriorityQueue ва Collections.sort() дар он аст, ки PriorityQueue ҳама вақт тартиби навбатро нигоҳ медорад, аммо шумо танҳо элементи аввалини навбатро гирифта метавонед. Шумо наметавонед ба таври тасодуфӣ ба унсури монанди PriorityQueue.get(4) дастрасӣ пайдо кунед.
  3. Агар дар маҷмӯа ягон нусха мавҷуд набошад, шумо метавонед TreeSet -ро интихоб кунед . Инчунин ба монанди PriorityQueue, TreeSet ҳамеша маҷмӯи фармоиширо нигоҳ медорад. Шумо метавонед унсури хурдтарин ё калонтаринро аз TreeSet гиред, аммо шумо ба ҳар ҳол наметавонед ба элементҳо дастрасии тасодуфӣ дошта бошед.
Оддӣ карда гӯем, Collections.sort() рӯйхати фармоишии якдафъаинаро пешкаш мекунад. PriorityQueue ва TreeSet коллексияи фармоиширо ҳамеша бо ҳисоби набудани дастрасии индексатсияшуда ба унсурҳо нигоҳ медоранд. 9. Collections.emptyList() ё мисоли нав Ҳамин савол ба emptyMap() ва emptySet() дахл дорад. Ҳарду усул рӯйхати холиро бармегардонанд, аммо Collections.emptyList() рӯйхати тағирнопазир аст. Ин маънои онро дорад, ки шумо наметавонед унсурҳои навро ба рӯйхати "холӣ" илова кунед. Дар замина, ҳар як занг ба усули Collections.emptyList() воқеан як мисоли нави рӯйхати холӣ эҷод намекунад. Ба ҷои ин, он намунаи холии мавҷударо дубора истифода хоҳад кард. Агар шумо бо Singleton ҳамчун намунаи тарроҳӣ шинос бошед , шумо бояд фаҳмед, ки чӣ маъно дорад. Ин бояд ба шумо иҷрои беҳтаре диҳад , агар зуд-зуд занг занед. 10 Нусхабардории маҷмӯа, Collections.copy() Ду роҳи нусхабардории рӯйхати манбаъ ба рӯйхати таъинот вуҷуд дорад. Яке аз роҳҳо ин истифодаи созандаи ArrayList мебошад. Роҳи дигар ин истифодаи усули Collections.copy() мебошад . Огоҳӣ дар сатри аввал: мо рӯйхатеро ҷудо карда истодаем, ки ҳадди аққал ба дарозии рӯйхати аслӣ баробар аст, зеро ҳуҷҷати Java дар бораи коллексияҳо мегӯяд: ArrayList dstList = new ArrayList (srcList);
Рӯйхати таъинот бояд ҳадди аққал то рӯйхати манбаъ дароз бошад.
Ин маънои онро дорад, ки рӯйхати ниҳоӣ набояд аз рӯйхати аслӣ кӯтоҳтар бошад. Ҳарду усул нусхабардории камёфт мебошанд. Пас, фарқияти байни ин ду усул чист? Аввалан, Collections.copy() иқтидори коллексияи dstList-ро аз нав тақсим намекунад, ҳатто агар dstList барои нигоҳ доштани ҳамаи элементҳои srcList фазои кофӣ надошта бошад. Ба ҷои ин, он IndexOutOfBoundsException -ро мепартояд . Касе метавонад пурсад, ки оё ин ягон фоида дорад. Сабаб дар он аст, ки ин кафолат медиҳад, ки усул дар вақти хаттӣ кор мекунад. Ин инчунин вақте мувофиқ аст, ки шумо мехоҳед массивҳоро аз нав истифода баред, на аз нав тақсим кардани хотира дар созандаи ArrayList. Ба ҷои хулоса Агар пас аз хондани мақола шумо ҳоло ҳам саволҳо дошта бошед, озодона аз онҳо дар шарҳҳо пурсед. Хамчунин агар дар тарчума ягон носахех ва ё хатои дигар пайдо кунед, пас ба ПМ нависед, ислох карда мешавад ва ба шумо ташаккур гуфта мешавад. Асли. ArrayList dstList = new ArrayList (srcList.size()); Collections.copy(dstList, srcList);
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION