ArrayList和LinkedList的面試題

2021-07-22 21:29:54 字數 1129 閱讀 8758

一、arraylist為什麼是執行緒不安全的?

arraylist在新增乙個元素的時候,它可能會有兩步來完成:

1. 在 items[size] 的位置存放此元素;

2. 增大 size 的值。

在單執行緒執行的情況下,如果 size = 0,新增乙個元素後,此元素在位置 0,而且 size=1;

而如果是在多執行緒情況下,比如有兩個執行緒,執行緒 a 先將元素存放在位置 0。但是此時 cpu 排程執行緒a暫停,執行緒 b 得到執行的機會。執行緒b也向此 arraylist 新增元素,因為此時 size 仍然等於 0 (注意哦,我們假設的是新增乙個元素是要兩個步驟哦,而執行緒a僅僅完成了步驟1),所以執行緒b也將元素存放在位置0。然後執行緒a和執行緒b都繼續執行,都增加 size 的值。 那好,現在我們來看看 arraylist 的情況,元素實際上只有乙個,存放在位置 0,而 size 卻等於 2。這就是「執行緒不安全」了。

二、arraylist能否無限新增元素?會拋異常嗎?

當我們使用arraylist時,我們可以無限的往裡新增元素,這是為什麼呢?它底層是由陣列實現的,使用無參構造方法時系統會預設提供預設引數10,而使用有參建構函式時我們會指定大小,我們都是知道使用陣列時當新增的元素個數大於陣列的初始化長度時會報陣列下標越界異常,那麼arraylist為什麼不會呢?因為arraylist會自動為其擴容,擴容後的大小是int newcapacity = (oldcapacity * 3)/2 + 1;  

三、arraylist和linkedlist的時間複雜度

arraylist 是線性表(陣列)

get() 直接讀取第幾個下標,複雜度 o(1)

add(e) 新增元素,直接在後面新增,複雜度o(1)

add(index, e) 新增元素,在第幾個元素後面插入,後面的元素需要向後移動,複雜度o(n)

remove()刪除元素,後面的元素需要逐個移動,複雜度o(n)

linkedlist 是鍊錶的操作

get() 獲取第幾個元素,依次遍歷,複雜度o(n)

add(e) 新增到末尾,複雜度o(1)

add(index, e) 新增第幾個元素後,需要先查找到第幾個元素,直接指標指向操作,複雜度o(n)

remove()刪除元素,直接指標指向操作,複雜度o(1)



Array List和ArrayList的區別與

定義 public abstract class array icloneable,ilist,icollection,ienumerable,istructuralcomparable,istructuraequatable 陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且賦值與修改元...

LinkedList和ArrayList的區別

對於集合collection下的list介面,有兩個實現類,arraylist和linkedlist,那麼他們兩個有什麼區別呢。arraylist的底層由陣列實現,而linkedlist的底層由雙向鍊錶實現,底層的不同才是他們區別的根源。然而因為他們繼承於同乙個父介面,他們的很多方法都是相同的。關於...

ArrayList和LinkedList的用法

集合的體系 collection 單列集合的根介面 list 如果是實現了list介面的實現類,該集合類具備的特點 有序,可重複 arraylist arraylist底層是維護了 乙個object陣列實現的,特點 查詢速度快,增刪慢。什麼時候使用arraylist 如果目前的資料是查詢比較多,增刪...