前言
??學java已經三四年了,一些簡單的數據結構如ArrayList,HashMap早已熟練掌握。但是吧,最近在寫的項目中總是莫名其妙的出現List的add()方法的淺復制現象。什么是淺復制呢?為什么出現呢?怎么解決呢?
開搞
1.先創(chuàng)建個實體類

2.什么是淺復制?
在項目中,總會時不時的遇見需要在集合中創(chuàng)建對象,在創(chuàng)建對象之后還要給對象一些屬性進行賦值,然后就把帶有值的對象放進集合中以便下面的操作。但是吧,理想和現實總是有些差距,在你添加了集合之后,去打印的時候總是出現這種情況:

然而你想的是這種情況:

這樣一看,頓時傻眼了,咋回事?急的抓耳撓腮??!找,找,找啊。。。。。(一下午過去了!)
其實這就是淺復制,數據都被最后一個覆蓋了。我總結了有三種情況?。ㄒ驗槲揖陀龅饺N情況?。?/p>
情況1.
在集合中賦值的時候是這種情況:

這種情況,我只能說:活該(新手除外)!(反正我沒犯過這種錯誤?。@明顯看就能看出來是會錯的,明顯創(chuàng)建的對象都是一個地址,把一個地址中的數據改來改去,添加的數據只是把一個地址中的數據復制了好幾份罷了!
解決:把創(chuàng)建的對象移到循環(huán)里,這樣就能在每次循環(huán)的時候出現新創(chuàng)建對象了,而新創(chuàng)建的對象肯定地址值是不同的!
情況2.
在集合賦值的時候是這種情況:


有的人說,咋回事?我明明就是這樣搞的啊?咋就不行了?
找不到錯哪了,然后又去百度了一下說可以用這種方法:

然并卵?。?!找,找,找啊。。。。。(一下午過去了?。?。然后找錘子去了,既然搞不定代碼只能搞(砸)電腦了!
這種情況,其實還是犯了一個錯誤,來,看看實體類就知道了:

加了static的數據是什么數據?靜態(tài)數據啊!靜態(tài)數據在哪?常量池??!常量池的數據只要符號一樣那就是同一地址??!可著一個地址使勁兒造(改來改去),這能行?肯定不行??!
解決方法:
1.要么刪了static,有時候為了方便使用不能刪??!這時候就看第二種方法了
2.去再造一個屬性,把用static修飾的在有參構造中賦值,用的時候用那個新造的屬性
情況3.
在多層for循環(huán),如:四層for循環(huán)中對對象賦值并修改或添加刪除,也會出現這種情況,這時候可以使用那個深度克隆的方法。有時候需求不要一樣!在四層for循環(huán)中可能不是用來返回數據的而是往某些文件或數據庫中寫數據的,這時候就可以直接在第四層for循環(huán)中進行接口的調用了!從根本上避免了淺復制!
網上還有一種是用流的方式操作,我不想用,因為在數據寫往文件的時候已經就相當于是在用流了,在復制中用流感覺大材小用了!還有可能也影響性能!
注:對于集合數據淺復制的情況有更好的方法的大佬可以在評論區(qū)留言,有想法的也可以留言或私信我。感謝感謝?。?!