向List中新增map被覆蓋

2021-08-20 12:45:47 字數 2347 閱讀 6345

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.賦值,最後乙個物件都會覆蓋前面的。解...