LinkedList?的作者說他自己都不用?LinkedList?
時(shí)間:2021-11-15 14:30:59
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]今天在網(wǎng)上沖浪,看到有文章說LinkedList的作者說他自己都不用LinkedList,我就特意去翻了翻他的推特,發(fā)現(xiàn)他確實(shí)說過這話!可能這就是大佬吧,我造輪子,但是我不用!或者這就是傳說中的廚子不吃自己做的菜?不扯了,言歸正傳。其實(shí)我個(gè)人覺得大佬說好像是事實(shí),因?yàn)樵跇I(yè)務(wù)上好像...
今天在網(wǎng)上沖浪,看到有文章說 LinkedList 的作者說他自己都不用 LinkedList,我就特意去翻了翻他的推特,發(fā)現(xiàn)他確實(shí)說過這話!
可能這就是大佬吧,我造輪子,但是我不用!或者這就是傳說中的廚子不吃自己做的菜?不扯了,言歸正傳。其實(shí)我個(gè)人覺得大佬說好像是事實(shí),因?yàn)樵跇I(yè)務(wù)上好像都用不到 LinkedList ,大多數(shù)場景下都是用 ArrayList 比較合適,我細(xì)數(shù)了下自己平日里的使用情況,真的都是 ArrayList 。說到這,可能有人不同意了,說我可是看過面試題的,LinkedList 可是有它的優(yōu)勢的!這題我也看過,沒記錯(cuò)的話應(yīng)該是:說說 ArrayList 和 LinkedList 的之間區(qū)別?我覺得這題可謂之為“八股文前三甲”,其實(shí)這題映射過來也就是關(guān)于數(shù)組與鏈表的比較。只要你在網(wǎng)上看過這道面試題,你看到的答案必然是:- 數(shù)組的隨機(jī)訪問快,插入和刪除慢
- 鏈表的插入刪除快,隨機(jī)訪問慢
- 頻繁增刪的情況下,用鏈表比較合適
- 在隨機(jī)查找多的情況下,用數(shù)組比較合適
public?class?YesArrayLinkedBattle?{
????private?static?final?int?COUNT?=?100000;
????static?List?fillList(List?list) ? {
????????for?(int?i?=?0;?i?????????????list.add(i);?//將list填滿,假裝我們在數(shù)據(jù)庫里得到這么多數(shù)據(jù)
????????}
????????return?list;
????}
????static?void?randomAdd(List?list,?String?listType) ?{
????????long?t1?=?System.currentTimeMillis();
????????for?(int?i?=?0;?i?????????????list.add(ThreadLocalRandom.current().nextInt(0,COUNT),?i);
????????}
????????long?t2?=?System.currentTimeMillis();
????????System.out.println(listType? "隨機(jī)位置插入"? ?COUNT? ?"次耗時(shí):"? ?(t2-t1));
????}
????public?static?void?main(String[]?args)?{
????????randomAdd(fillList(new?ArrayList<>(COUNT)),?"數(shù)組");
????????randomAdd(fillList(new?LinkedList<>()),?"鏈表");
????}
}
這個(gè)實(shí)驗(yàn)很粗暴簡單,但也很直觀,分別對(duì)被填滿數(shù)據(jù)的 ArrayList 和 LinkedList 執(zhí)行 10 萬次隨機(jī)的插入操作,然后分別統(tǒng)計(jì)耗時(shí)。執(zhí)行結(jié)果如下:
是吧,在隨機(jī)插入的情況下,鏈表不占優(yōu)勢反而大弱于數(shù)組!所以說對(duì)于鏈表的插入操作,不能只關(guān)注其插入的時(shí)間復(fù)雜度,也要算上查找到前節(jié)點(diǎn)的開銷,因此不能武斷地說:頻繁增刪的情況下,用鏈表比較合適當(dāng)然,如果數(shù)據(jù)量很小的話,其實(shí)兩者都是差不多的,比如長度都為 100 ,執(zhí)行 100 次,則耗時(shí)如下:






