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