java面试——集合(ArrayList、lterator、LinkedList)源码理解
生活随笔
收集整理的這篇文章主要介紹了
java面试——集合(ArrayList、lterator、LinkedList)源码理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- ArrayList擴容機制
- lterator迭代器
- ArrayList與LinkedList的區別
ArrayList擴容機制
- 初始化:(無參時)數組大小是0,添加第一個元素時是10。有參數時,數組大小就是參數。
- 擴容條件:超過容量大小的3/4。
- 以后擴容大小是上一次數組大小的1.5倍(原容量右移一位+原容量)。
- addAll()擴容機制: 比較下次擴容的大小和添加元素的個數,取較大值。
lterator迭代器
- fail-fast:一旦發現遍歷時,其他線程來修改,即將拋異常(ArrayList)
- 如何判斷——在迭代器初始化成員變量時會記錄當前集合被修改的次數,在遍歷中一直比較這兩個值是否相等。如果在遍歷的途中集合的修改次數參數改變,就會拋出異常
- fail-safe:遍歷時其他線程來修改,犧牲一致性,保持遍歷(CopyOnWriteArrayList)
- 初始化時在迭代器成員中復制了當前集合
- add()源碼——寫時復制,即在添加元素時,復制一個新數組(長度+1),在新數組的最后加入新元素。
ArrayList與LinkedList的區別
- 底層結構:
- ArrayList是數組,需要連續的內存
- LinkedList是雙向鏈表,不需要連續內存
- 隨機訪問性能
- ArrayList支持隨機訪問,實現了RandomAccess接口(里面沒有方法,只是一個標識)
- LinkedList不支持隨機訪問,因為是鏈式存儲,需要遍歷尋址。
- 插入、刪除對比
- ArrayList尾部插入、刪除性能可以,其它部分插入、刪除都會移動數據,因此性能會低(未擴容時)
- LinkedList頭尾插入刪除性能高
- 內存
- ArrayList:可以利用CPU緩存、局部性原理
- LinkedList:占用內存多
總結
以上是生活随笔為你收集整理的java面试——集合(ArrayList、lterator、LinkedList)源码理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关闭系统还原清理垃圾文件
- 下一篇: 如何在鼠标右键菜单中添加自定义菜单?工效