在List的add方法新增物件時都是最後的一條記錄的重複
阿新 • • 發佈:2019-02-20
在做專案的時候,遇到過一個很容易忽略的問題。就是自己感覺邏輯明明沒錯的,但是為什麼輸出結果跟自己想象的有點出入呢?比如下面的程式碼:(先自己考慮會輸出什麼,再試試程式碼會輸出什麼)
public class ListTest { public static void main(String[] arg0){ List<User> userList=new ArrayList<User>(); User user=new User(); for(int i=0;i<10;i++){ user.setUserName(i+" "); userList.add(user); } System.out.println(userList.size()); for(int i=0;i<10;i++){ System.out.println(userList.get(i).getUserName()); } } } class User{ private String userName; public User(){ } public User(String userName){ this.userName=userName; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
輸出結果如下:
你會發現所有的結果怎麼都是最後一個數的重複呢?
我們回去看上面的程式碼:我們new了一個User物件,就只是new了一個唯一的ID,我們將物件放入list時,list就只是添加了一個物件的引用而已,而我們只是簡單的set物件進行對物件的值的改變,但是其ID還是唯一的,list又只是對於物件唯一ID的引用。所以結果就顯而易見的。
要改正這個程式碼,只需在迴圈中不斷new一個User物件就可以了,使其ID不唯一。
下面是改進的程式碼:
public class ListTest { public static void main(String[] arg0){ List<User> userList=new ArrayList<User>(); for(int i=0;i<10;i++){ User user=new User(); user.setUserName(i+" "); userList.add(user); } System.out.println(userList.size()); for(int i=0;i<10;i++){ System.out.println(userList.get(i).getUserName()); } } } class User{ private String userName; public User(){ } public User(String userName){ this.userName=userName; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }