ArrayList可能是Java資料結構中最簡單的一種了,即使一個非Java程式設計師可能也知道這個資料結構,因為所有的語言中都有這樣的類似的資料結構。可是在經歷過的無數的面試中我發現並不是所有的小夥伴都精通這種簡單的資料結構的,比如下面的幾道題,能回答成功一般以上的都不多。不信你來挑戰一下!

ArrayList插入刪除一定慢麼?

取決於你刪除的元素離陣列末端有多遠,ArrayList拿來作為堆疊來用還是挺合適的,push和pop操作完全不涉及資料移動操作。

ArrayList的遍歷和LinkedList遍歷效能比較如何?

論遍歷ArrayList要比LinkedList快得多,ArrayList遍歷最大的優勢在於記憶體的連續性,CPU的內部快取結構會快取連續的記憶體片段,可以大幅降低讀取記憶體的效能開銷。

ArrayList是如何擴容的?

ArrayList擴容後的大小等於擴容前大小的1。5倍,當ArrayList很大的時候,這樣擴容還是挺浪費空間的,甚至會導致記憶體不足丟擲OutOfMemoryError。擴容的時候還需要對陣列進行複製,這個也挺費時的。所以我們使用的時候要竭力避免擴容,提供一個初始估計容量引數,以免擴容對效能帶來較大影響。

ArrayList的預設陣列大小為什麼是10?

其實小編也沒找到具體原因。據說是因為sun的程式設計師對一系列廣泛使用的程式程式碼進行了調研,結果就是10這個長度的陣列是最常用的最有效率的。也有說就是隨便起的一個數字,8個12個都沒什麼區別,只是因為10這個陣列比較的圓滿而已。

ArrayList是執行緒安全的麼?

當然不是,執行緒安全版本的陣列容器是Vector。Vector的實現很簡單,就是把所有的方法統統加上synchronized就完事了。你也可以不使用Vector,用Collections。synchronizedList把一個普通ArrayList包裝成一個執行緒安全版本的陣列容器也可以,原理同Vector是一樣的,就是給所有的方法套上一層synchronized。

陣列用來做佇列合適麼?

佇列一般是FIFO的,如果用ArrayList做佇列,就需要在陣列尾部追加資料,陣列頭部刪除陣列,反過來也可以。但是無論如何總會有一個操作會涉及到陣列的資料搬遷,這個是比較耗費效能的。

這個回答是錯誤的!

ArrayList固然不適合做佇列,但是陣列是非常合適的。比如ArrayBlockingQueue內部實現就是一個環形佇列,它是一個定長佇列,內部是用一個定長陣列來實現的。另外著名的Disruptor開源Library也是用環形陣列來實現的超高效能佇列,具體原理不做解釋,比較複雜。簡單點說就是使用兩個偏移量來標記陣列的讀位置和寫位置,如果超過長度就折回到陣列開頭,前提是它們是定長陣列。

坑人無數的Java面試題之ArrayList

閱讀更多相關文章,關注知乎專欄【碼洞】