ArrayList және LinkedList екеуі де Тізім интерфейсін іске асырады және олардың әдістері мен нәтижелері бірдей. Алайда олардың арасындағы айырмашылықтар аз, олар талапқа байланысты басқа біреуден жақсы болады.
ArrayList Vs LinkedList
1) Іздеу : ArrayList іздеу операциясы LinkedList іздеу амалдарымен салыстырмалы түрде өте жылдам. get(int index)
in ArrayList O(1)
өнімділігін береді, ал LinkedList өнімділігі O(n)
.
Себеп: ArrayList элементтерге арналған индекске негізделген жүйені қолдайды, себебі ол жиым деректер құрылымын жанама түрде пайдаланады, ол оны тізімдегі элементті іздеу үшін жылдам етеді. Екінші жағынан, LinkedList элементтерді іздеу үшін барлық элементтер арқылы өтуді талап ететін екі есе байланысқан тізімді іске асырады.
2) Жою : LinkedList жою операциясы O(1)
жұмысының нәтижесін береді, ал ArrayList айнымалы өнімділікті береді: O(n)
ең нашар жағдайда (бірінші элементті алып тастағанда) және O(1)
жақсы жағдайда (соңғы элементті алып тастағанда).
Қорытынды: LinkedList элементін жою ArrayList-ке қарағанда жылдамырақ.
Себеп: LinkedList әрбір элементі тізімдегі көршілес элементтерді көрсететін екі көрсеткішті (мекен-жайларды) сақтайды. Осыдан кейін, жойылу тек жойылатын түйіннің екі көршілес түйіндерінде (элементтерінде) көрсеткіш орнында өзгертуді талап етеді. In ArrayList барлық элемент жойылған элементтің кеңістігін толтыру үшін жылжытуды қажет етеді.
3) Performance : InsertedList add әдісі O(1)
өнімділігін береді, ал ArrayList ең нашар жағдайда O(n)
береді. Себеп шығуды алып тастау үшін түсіндірілгендей.
4) Memory Overhead : ArrayList индекстер мен элемент деректерін сақтайды, ал LinkedList көрші түйіндер үшін элементтік деректерді және екі көрсеткішті сақтайды, осылайша, еске тұтыну салыстырмалы түрде LinkedList-да жоғары.
Бұл сыныптар арасында төмендегідей ұқсастықтар бар:
- ArrayList және LinkedList екеуі де Тізім интерфейсін енгізу болып табылады.
- Олар екеуі элементтерді кірістіру тәртібін сақтайды, яғни ArrayList және LinkedList элементтерін көрсету кезінде нәтижелер жиынтығы элементтерге Тізімге енгізілген бірдей тәртіпке ие болады.
- Бұл екі сынып синхрондалмаған және
Collections.synchronizedList
әдісін пайдалану арқылы нақты синхрондалуы мүмкін. - Бұл сыныптармен қайтарылған иератор мен тізімге кіретіндер (егер тізімді итератор құрастырылғаннан кейін кез келген уақытта құрылымды түрде өзгертілген болса, оны кез келген әдіспен алып тастау немесе әдістерді қосу арқылы қоспағанда, Itatorator ConcurrentModificationException қояды ).
LinkedList пайдалану кезінде және ArrayList пайдалану керек пе?
1) Жоғарыда түсіндірілгендей, кірістіру және жою әрекеттері ArrayList ( O(n)
) салыстырғанда LinkedList-те жақсы нәтиже береді ( O(1)
O(n)
). Сондықтан егер қосымшада жиі қосымша қосу және жою қажет болса, LinkedList - бұл жақсы таңдау.
2) Search (get әдісі) операциялары Arraylist ( O(1)
) жылдам, бірақ LinkedList ( O(n)
) емес, сондықтан операцияларды азайту және жою операциялары және іздеу операциялары талаптары аз болса, ArrayList ең жақсы ставка болады.
шын мәнінде үлкен түсініктемелер
Мен java-да жаңа. Мен ArrayList және LinkList арасындағы негізгі айырмашылықты білгім келеді. Бұл жақсы мақала. Жақсы жұмыс. Ницца түсіндірді. Бұл шынымен маған көмектеседі.
өте гуд түсіндірмесі. Өте жақсы.
Көп рақмет. Толығымен қанағаттанған жауап!
Сен дедің -
Бұл сыныптармен қайтарылған итератор мен тізімге кіретіндер (егер тізімді итератор жасағаннан кейін кез келген уақытта құрылымды түрде өзгертілсе, оны итератордың өзінен алып тастау немесе әдістерді қоспағанда).
Iterator арқылы элементті қалай қосасыз?
Сәлем,
Бұл пост шынымен жақсы. Бірақ, жоғарыда айтылғандарға бір күмәнім бар. arraylist іздегенде, O (1) индексі салдарынан келеді. Сонымен қатар, аррайликтер жойылған кезде бірдей емес.
Құрметпен,
Subbareddy
ArrayList жою үшін бірдей емес, өйткені бұл индексте элементті тез табуға мүмкіндік беретін болса да, жойылған элементтің бос индексі толтырылуы үшін барлық элементтерді кейінгі индекстерге ауыстыруға тура келеді.
Бұл шынымен жақсы пост, бірақ мен жиым тізімі мен байланысты тізім анықтамасын білгім келеді, мен анықтаманы ала алмаймын.
Көресіз: ArrayList индексі бар және LinkedList келесі түйінді сілтегіші бар. Осылайша, ArrayList элементін жою келесі элементтерді солға жылжытады, соншама көп уақыт кетеді. Егер LinkedList элементі жойылса, онда келесі элементтерді қалдырудың қажеті жоқ, көрсеткішті келесі түйінге бағыттау қажет.
ArrayList деректерді сақталатын жад орындарында сақтайды, сондықтан жою әрекеті орындалса, ол массивтің листінде бос орынды жасайды. Бұл бос кеңістікті ауысымдық операциялардың көп мөлшерін орындау арқылы қайтадан басып алуға тура келеді. Осылайша, массивтің тізімінен DELETION O (1) бермейді.
неге элементтің аяғына кіргізу үшін массивтер тізімі енгізілмейді -> сондықтан қайта индекстеу қажет емес және кірістіру операциясы O (1) бола ма? Егер мен байланыстырылған тізімнен элементті жойғым келсе, алдымен элементті іздестіру қажет емес пе? (Ол O (n) болар еді)?
Құрметті Роберт, мен өзімнен де сұрадым. Мен кодты қарап шығып, O (n) болды. Егер сіз оны итераторды алып тастау немесе қосу үшін қолдансаңыз, сізде O (1) бар.
Stackoverflow бөлімін қараңыз: http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist
Жиым тізімі қосылымы O (1) болып табылады, себебі ол элементті соңында қосады. Кірістіру тәртібі сақталады. Сондықтан қосу O (1) ғана болуы керек ....
Тамаша түсініктеме :)
Үлкен рахмет! Ал деректерді өңдеу туралы не деуге болады? Оны қалай өзгерткен болсаңыз, қайсысы жақсы? Түрі бүтін болса және элементтердің мәндерін үнемі арттырсаңыз. Кешіріңіз, егер мәселе ақылсыз болса.