සාරාංශය ArrayList
සමග ArrayDeque
දී වඩාත් වේ බොහෝ වඩා භාවිතා-නඩු LinkedList
. ඔබට විශ්වාස නැත්නම් - ආරම්භ කරන්න ArrayList
.
LinkedList
සහ ArrayList
ලැයිස්තු අතුරුමුහුණතේ වෙනස් ක්රියාත්මක කිරීම් දෙකක් වේ. LinkedList
එය ද්විත්ව සම්බන්ධිත ලැයිස්තුවක් සමඟ ක්රියාත්මක කරයි. ArrayList
ගතිකව නැවත ප්රමාණයේ අරාවකින් එය ක්රියාත්මක කරයි.
සම්මත සම්බන්ධිත ලැයිස්තුව සහ අරාව මෙහෙයුම් වලදී මෙන්, විවිධ ක්රමවලට විවිධ ඇල්ගොරිතම ධාවන වේලාවන් ඇත.
සදහා LinkedList<E>
get(int index)
වන සාමාන්ය (n) (සමග n / 4 සාමාන්යයෙන් පියවර), නමුත් සාමාන්ය (1) වන විට index = 0
හෝ index = list.size() - 1
(මේ අවස්ථාවේ දී, ඔබ ද භාවිතා කළ හැකිය getFirst()
සහ getLast()
). හි ප්රධාන වාසි වලින් එකක් LinkedList<E>
add(int index, E element)
වන සාමාන්ය (n) (සමග n / 4 සාමාන්යයෙන් පියවර), නමුත් සාමාන්ය (1) වන විට index = 0
හෝ index = list.size() - 1
(මේ අවස්ථාවේ දී, ඔබ ද භාවිතා කළ හැකිය addFirst()
සහ addLast()
/ add()
). හි ප්රධාන වාසි වලින් එකක් LinkedList<E>
remove(int index)
වන සාමාන්ය (n) (සමග n / 4 සාමාන්යයෙන් පියවර), නමුත් සාමාන්ය (1) වන විට index = 0
හෝ index = list.size() - 1
(මේ අවස්ථාවේ දී, ඔබ ද භාවිතා කළ හැකිය removeFirst()
සහ removeLast()
). හි ප්රධාන වාසි වලින් එකක් LinkedList<E>
Iterator.remove()
වන දෙවියනි, (1) . හි ප්රධාන වාසි වලින් එකක් LinkedList<E>
ListIterator.add(E element)
වන දෙවියනි, (1) . හි ප්රධාන වාසි වලින් එකක් LinkedList<E>
සටහන: බොහෝ මෙහෙයුම් සඳහා සාමාන්යයෙන් n / 4 පියවර, හොඳම අවස්ථාවෙහි නියත පියවර ගණන (උදා: දර්ශකය = 0), සහ නරකම අවස්ථාවක n / 2 පියවර (ලැයිස්තුවේ මැද)
සදහා ArrayList<E>
get(int index)
වන දෙවියනි, (1) . ප්රධාන ප්රතිලාභය ArrayList<E>
add(E element)
වන දෙවියනි, (1) ක්රමක්ෂය, නමුත් සාමාන්ය (n) අරාව ප්රථිප්රමාණය සහ පිටපත් කළ යුතුය සිට නරකම
add(int index, E element)
වන සාමාන්ය (n) (සමග n / 2 සාමාන්ය පියවර)
remove(int index)
වන සාමාන්ය (n) (සමග n / 2 සාමාන්ය පියවර)
Iterator.remove()
වන සාමාන්ය (n) (සමග n / 2 සාමාන්ය පියවර)
ListIterator.add(E element)
වන සාමාන්ය (n) (සමග n / 2 සාමාන්ය පියවර)
සටහන: මෙහෙයුම් බොහෝ අවශ්ය n / 2 සාමාන්ය මත පියවර නිරන්තර හොඳම නඩුව (ලැයිස්තුවේ අවසානය) පියවර සංඛ්යාව, n නරකම (ලැයිස්තුව ආරම්භයක්) පියවර
LinkedList<E>
iterator භාවිතා කරමින් නියත-කාලීන ඇතුළත් කිරීම් හෝ ඉවත් කිරීම් සඳහා ඉඩ ලබා දේ , නමුත් මූලද්රව්යවල අනුක්රමික ප්රවේශය පමණි. වෙනත් වචන වලින් කිවහොත්, ඔබට ලැයිස්තුව ඉදිරියට හෝ පසුපසට ගමන් කළ හැකිය, නමුත් ලැයිස්තුවේ ස්ථානයක් සොයා ගැනීම ලැයිස්තුවේ ප්රමාණයට සමානුපාතික වේ. ජාවඩොක් පවසන්නේ “ලැයිස්තුවට දර්ශක කරන මෙහෙයුම් ආරම්භයේ සිට අවසානය දක්වා, කුමන දෙයට වඩා සමීපද යන්න” , එබැවින් එම ක්රම සාමාන්යයෙන් O (1) වුවද O ( n) ( n / 4 පියවර ) වේ index = 0
.
ArrayList<E>
, අනෙක් අතට, වේගවත් අහඹු කියවීමේ ප්රවේශයට ඉඩ දෙන්න, එවිට ඔබට ඕනෑම මූලද්රව්යයක් නියත වේලාවක ලබා ගත හැකිය. නමුත් ඕනෑම තැනකින් එකතු කිරීම හෝ ඉවත් කිරීම, නමුත් අවසානයට අවශ්ය වන්නේ පසු විපරම් කරන ලද සියලුම මූලද්රව්යයන් විවෘත කිරීම හෝ පරතරය පිරවීම ය. එසේම, ඔබ යටින් පවතින අරාවේ ධාරිතාවට වඩා වැඩි මූලද්රව්යයක් එකතු කරන්නේ නම්, නව අරාවක් (ප්රමාණය මෙන් 1.5 ගුණයක්) වෙන් කර ඇති අතර, පැරණි අරාව නව ඒවාට පිටපත් කරනු ලැබේ, එබැවින් O (n) ට එකතු කිරීම නරකම ArrayList
දෙයකි නඩුව නමුත් සාමාන්යයෙන් නියතයි.
එබැවින් ඔබ කිරීමට අදහස් කරන මෙහෙයුම් මත පදනම්ව, ඔබ ඒ අනුව ක්රියාත්මක කිරීම් තෝරා ගත යුතුය. ඕනෑම ආකාරයක ලැයිස්තුවක් උපුටා දැක්වීම ප්රායෝගිකව සමානව ලාභදායී වේ. (ක කට එල්ලාවල මහතා ArrayList
තාක්ෂණික වේගවත් වේ, නමුත් ඔබ ඇත්තටම කාර්ය සාධන සංවේදී දෙයක් කරන්නේ නම් මිස, ඔබ මේ ගැන කරදර නොවිය යුතු - ඔවුන් නියත නිසා.)
LinkedList
මූලද්රව්ය ඇතුළු කිරීමට සහ ඉවත් කිරීමට ඔබ දැනට පවතින අනුකාරක නැවත භාවිතා කරන විට පැන නගින ප්රධාන වාසි පැන නගී. ලැයිස්තුව දේශීයව පමණක් වෙනස් කිරීමෙන් මෙම මෙහෙයුම් O (1) හි කළ හැකිය. රාශියද ලැයිස්තුව තුළ, අරාව අවශ්යතා ඉතිරි කිරීමට ගෙන (එනම් පිටපත්). අනෙක් පැත්තෙන්, නරකම අවස්ථාව සඳහා O (n) ( n / 2 පියවර) LinkedList
හි ඇති සම්බන්ධතා අනුගමනය කරමින් මාධ්යයක් සෙවීම, අපේක්ෂිත ස්ථානයක ගණිතමය වශයෙන් ගණනය කර O (1) වෙත ප්රවේශ විය හැකිය .ArrayList
LinkedList
ලැයිස්තුවේ ප්රධානියාගෙන් ඔබ එකතු කරන විට හෝ ඉවත් කරන විට භාවිතා වන තවත් වාසියක් වන්නේ , එම මෙහෙයුම් O (1) වන අතර ඒවා O (n) වන අතර ArrayList
. හිසෙන් එකතු කිරීම සහ ඉවත් කිරීම සඳහා ArrayDeque
හොඳ විකල්පයක් විය හැකි බව සලකන්න LinkedList
, නමුත් එය a නොවේ List
.
එසේම, ඔබට විශාල ලැයිස්තු තිබේ නම්, මතක භාවිතය ද වෙනස් බව මතක තබා ගන්න. LinkedList
ඊලඟ සහ පෙර මූලද්රව්යයන් සඳහා වන දර්ශක ද ගබඩා කර ඇති බැවින් a හි සෑම මූලද්රව්යයකටම වඩා ඉහළින් ඇත. ArrayLists
මේ පොදු කාර්යය නැහැ. කෙසේ වෙතත්, ArrayLists
මූලද්රව්ය සැබවින්ම එකතු කර තිබේද යන්න නොසලකා ධාරිතාව සඳහා වෙන් කර ඇති තරම් මතකය ගන්න.
A හි පෙරනිමි ආරම්භක ධාරිතාව ArrayList
ඉතා කුඩාය (10 ජාවා 1.4 - 1.8 සිට). නමුත් යටින් ක්රියාත්මක කිරීම අරාව බැවින්, ඔබ බොහෝ අංග එකතු කරන්නේ නම් අරාව ප්රමාණය වෙනස් කළ යුතුය. ඔබ බොහෝ මූලද්රව්ය එකතු කිරීමට යන බව දැනගත් විට ප්රතිප්රමාණනය කිරීමේ අධික පිරිවැය වළක්වා ගැනීම ArrayList
සඳහා, ඉහළ ආරම්භක ධාරිතාවක් සහිතව එය සාදන්න.