1.這裡放入list裡的是不同的map,雖然map d是同乙個map,但是指向了不同的位址
當我們把alist.get(i)賦值給dmap的時候,就已經把dmap的位址指向了對應的alist中的某個map,例如d=a,這時a和d是完全相等的兩個物件,他們在棧上的引用位址是相同的,當a賦值給d的時候,d的引用已經指向了a的記憶體區域,這時候我們修改d的話,實際上修改的也是a,當迴圈到d=b的時候,d在棧上的引用位址又指向了b,以此類推
public static void main(string argv)
system.out.println(blist);
}
[, , ]
[, , ]
2.由於第乙個for迴圈中的amap在棧上並沒有改變過引用,所以amap所指向的物件是一直是同乙個,所以導致list資料全被覆蓋
public static void main(string argv)
system.out.println(alist);
[, , ]
3.接上乙個例子,這裡第二個for迴圈明明每次都是新建了一次bmap,然後資料還是被覆蓋掉,主要問題還是出現在第乙個for迴圈中,因為整段程式中自始至終只有乙個可用物件amap
這種複製可以稱為淺複製,只是複製了物件的引用而已,雖然第二個for迴圈的bmap是迴圈建立的,並且每次new乙個物件的時候,都會在記憶體區域開闢乙個新的記憶體空間準備使用,當amap賦值給bmap的時候,bmap在棧中的引用已經指向了amap在堆中的位置,新開出的bmap記憶體空間是沒有引用的,對於沒有任何引用的記憶體區域或棧中引用指向了null,gc會進行**,所以這樣寫不僅沒用,還增加了底層的負擔
public static void main(string argv)
system.out.println(alist);
for(int i = 0;i();
bmap = alist.get(i);
bmap.put("hehe",i);
}system.out.println(alist);
}
[, , ]
[, , ]
4.綜上,第乙個for迴圈中要每次都建立乙個新map,而不能只是改變引用,而第二個for迴圈我們只是引用物件,並不需要建立新物件
public static void main(string argv)
system.out.println(alist);
map bmap = null;
for(int i = 0;i接下來做個測試,看看是否如上所述:
public static void main(string argv)
system.out.println(alist);
list> blist = new arraylist();
map bmap = null;
for(int i = 0;i> clist = new arraylist();
for(int i = 0;i輸出:
[, , ]
[, , ]
[, , ]
[, , ]
true
true
5.如上所述,上述傳遞的map都是同乙個物件,導致獲得blist後alist也發生了變化, 那麼,如果我們既想保留alist不變,又想在alist的基礎上增加新的資料獲得blist,那該怎麼辦呢
這次的需求其實就是指的 深拷貝,真正意義上的複製,真正新開闢了記憶體,真正在堆中複製了物件
public static void main(string argv)
system.out.println(alist);
list> blist = new arraylist();
for(int i = 0;i輸出
[, , ]
[, , ]
[, , ]
false
總結:1,2,3,4所舉例子都是為了說明淺複製的情況,而5是指在需要深拷貝的情況下採取的措施 向map中新增成員操作
首先從乙個例子開始 定義乙個map,關鍵字是家族的姓,值是乙個vector,儲存家中孩子們的名字。實現新增新的家族以及向已有家庭中新增新的孩子。include include include include using namespace std int main for map iterator ...
迴圈新增資料被覆蓋,解決方案!
當你要返回前台資料列表的時候,後台定義了乙個vo類。然後查詢資料做迴圈新增時,一定注意 把vo類放到迴圈裡面賦值那樣就不會出現覆蓋值了 舉例,假如studentvo類時返回資料列表的,liststo new arraylist liststu studentservice.query for stu...
多執行緒使用中 對像被覆蓋的BUG
在使用多執行緒傳遞viewtransactionsvo到處理執行緒threadutil中後,在threadutil中new多個viewtransactions物件 one.n,然後one viewtransactionsvo 傳遞進來的物件 此後無論怎麼對one.賦值,最後乙個物件都會覆蓋前面的。解...