今天遇到一個有意思的問題,當我遍歷數組的同時在for循環中使用list.add(),但這樣會將之前的內容也覆蓋掉。本來有3條數據,但這樣會得到三條相同的數據
T t =new T(); List<T> tList = new List<T>(); for(int i=0;i<10;i++){ t.num=i; tList.add(t); }
這種情況中tList存的是t的引用(地址),所以add的所有值其實都相同,就是t最開始new時的地址中的值。
解決辦法:
在循環中將你的對象再new一次
原因:
當使用List<T>時,如果T是引用類型,保存的是引用,如果是值類型,保存的是值本身。
1、T是對象是,也就是說如果是引類型時,在循環外邊已經new了一個類型為T的對象,相當於這個對象的地址在內存空間已經開辟出來了,保存到了固定的位置,這時候我們使用add方法時,會增加值的個數,但引用地址不變,所以后面的值會覆蓋掉前面的值
2、T是值對象時,這種和上面就不一樣了,值對象用來保存一組不會改變的量,當我們需要使用這個對象時,會在系統中開辟另一個空間。因此,值對象使用add方法時不會出現覆蓋問題。