在List的add方法添加對象時都是最後的一條記錄的重複

在做項目的時候,遇到過一個很容易忽略的問題。就是自己感覺邏輯明明沒錯的,但是爲什麼輸出結果跟自己想象的有點出入呢?比如下面的代碼:(先自己考慮會輸出什麼,再試試代碼會輸出什麼)


[java] view plain copy
  1. public class ListTest {  
  2.     public static void main(String[] arg0){  
  3.         List<User> userList=new ArrayList<User>();  
  4.         User user=new User();  
  5.         for(int i=0;i<10;i++){  
  6.               
  7.             user.setUserName(i+" ");  
  8.             userList.add(user);  
  9.         }  
  10.           
  11.         System.out.println(userList.size());  
  12.           
  13.         for(int i=0;i<10;i++){  
  14.             System.out.println(userList.get(i).getUserName());  
  15.         }  
  16.           
  17.           
  18.       
  19.     }  
  20. }  
  21.   
  22. class User{  
  23.       
  24.     private String userName;  
  25.       
  26.     public User(){  
  27.           
  28.     }  
  29.       
  30.     public User(String userName){  
  31.         this.userName=userName;  
  32.     }  
  33.       
  34.       
  35.     public String getUserName() {  
  36.         return userName;  
  37.     }  
  38.   
  39.     public void setUserName(String userName) {  
  40.         this.userName = userName;  
  41.     }  
  42.       
  43.       
  44.       
  45.       
  46. }  


輸出結果如下:



你會發現所有的結果怎麼都是最後一個數的重複呢?

我們回去看上面的代碼:我們new了一個User對象,就只是new了一個唯一的ID,我們將對象放入list時,list就只是添加了一個對象的引用而已,而我們只是簡單的set對象進行對對象的值的改變,但是其ID還是唯一的,list又只是對於對象唯一ID的引用。所以結果就顯而易見的。

要改正這個代碼,只需在循環中不斷new一個User對象就可以了,使其ID不唯一。

下面是改進的代碼:

[java] view plain copy
  1. public class ListTest {  
  2.     public static void main(String[] arg0){  
  3.         List<User> userList=new ArrayList<User>();  
  4.           
  5.         for(int i=0;i<10;i++){  
  6.             User user=new User();  
  7.             user.setUserName(i+" ");  
  8.             userList.add(user);  
  9.         }  
  10.           
  11.         System.out.println(userList.size());  
  12.           
  13.         for(int i=0;i<10;i++){  
  14.             System.out.println(userList.get(i).getUserName());  
  15.         }  
  16.           
  17.           
  18.       
  19.     }  
  20. }  
  21.   
  22. class User{  
  23.       
  24.     private String userName;  
  25.       
  26.     public User(){  
  27.           
  28.     }  
  29.       
  30.     public User(String userName){  
  31.         this.userName=userName;  
  32.     }  
  33.       
  34.       
  35.     public String getUserName() {  
  36.         return userName;  
  37.     }  
  38.   
  39.     public void setUserName(String userName) {  
  40.         this.userName = userName;  
  41.     }  
  42.       
  43.       
  44.       
  45.       
發佈了10 篇原創文章 · 獲贊 6 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章