對Java list集合的新認知

人家沒那麼好啦發表於2019-01-18

問題描述

一個介面透傳集合列表資料到另一個介面,當資料儲存後,上個介面列表資料發生改變,反之不變。功能開發完,測試時,修改資料沒儲存,直接返回,上個介面資料竟然也發生改變了!

思考

  1. 因為用的EventBus進行了傳值,第一反應框架的bug?
    大致瀏覽了EventBus原始碼,發現值傳遞過程中,原始碼沒對值做任何操作。
  2. 自己的問題?
    寫了個簡單demo測試,發現也會有同樣的問題。demo測試期間想到,是不是集合賦值給另一個集合,兩個集合記憶體地址用的是同一份,列印兩個集合hashCode發現輸出內容一致,證明了自己的猜想。

分析

搜尋過程中,發現了一篇博文,連結。java list集合底層使用的是陣列,陣列以地址形式進行儲存。當我們呼叫list集合addAll()方法,或者直接賦值,兩個集合記憶體地址用的是同一份,這就是list集合的淺拷貝。深拷貝就不說了,我認為開發中幾乎用不到,而且深拷貝很耗效能的。

問題解決

讓兩個集合沒有任何關聯,難道只能用深拷貝去避免嗎?實際上,以上問題產生是我對V層理解不夠深刻,或者說程式碼邏輯有問題。因為當使用者編輯資料時,我也實時更新集合列表中的資料了。解決上面的問題很簡單,使用者編輯資料時,不應該實時更新列表資料,而是使用者點選儲存按鈕,再把改變的資料更新到集合中透傳回到上個介面。

後記

實際上平常開發中用到的列表展示就是利用了集合的淺拷貝這一特性。只不過開發過程中,沒有過多的去思考。這就是典型的只知其然不知其所以然!慶幸的是,通過上述問題的產生,讓我對list集合認知更上一層樓,以後再次遇到類似問題,也能快速去解決了。

ps: 在此,厚著臉皮推薦下自己的公眾號,公眾號主要分享的是我對股市(投資)、樓市、生活的感悟等,技術分享次要(我是個技術萌新)希望會對你有所幫助。

Alt

相關文章