list.add()中的小細節
最近在碼代碼的時候發現一個有趣的list問題,就是list<基礎類型>中的add()方法和list<對象>中的add()方法會有點區別。
前者是和預想的一樣,就是給集合按順序添加元素,而后者在添加的時候會覆蓋前面的元素。
例如:
list<基礎類型>
public static void main(String[] args){
List<String> list = new ArrayList<String>();
list.add("第一個元素");
list.add("第二個元素");
list.add("第三個元素");
list.add("第四個元素");
//list.remove(1);
//通過foreach方式遍歷所有元素
for (String element : list){
System.out.println("foreach遍歷:" + element);
}
運行結果
list<自定義對象>
List<Cat> cats = findCatByCatId(catid);
CatInfoDto catInfoDto = new CatInfoDto();
List<Object> catInfoDtos = new ArrayList<>();
for (Cat cat : cats){
catInfoDto.setCatid(cat.getId());
catInfoDto.setCatname(cat.getCatname());
catInfoDtos.add(catInfoDto);
}
每一次遍歷,list中的內容都會被新的cat覆蓋
查詢資料發現,轉遞給add()方法的是catInfoDto類的引用,是一個內存地址,所以定義在外部for循環外部的對象的引用,在for循環的時候沒有改變內存地址,所以添加到list的是同一個對象的地址,所以每次add都會覆蓋掉前面的內容。
如果想不覆蓋的話,在for循環內部再重新new一個catInfoDto類對象即可,這樣每次循環都會重新在內存中開辟一段空間
List<Cat> cats = findCatByCatId(catid);
CatInfoDto catInfoDto = new CatInfoDto();
List<Object> catInfoDtos = new ArrayList<>();
for (Cat cat : cats){
catInfoDto = new CatInfoDto();
catInfoDto.setCatid(cat.getId());
catInfoDto.setCatname(cat.getCatname());
catInfoDtos.add(catInfoDto);
}