1. 程式人生 > >在List的add方法新增物件時都是最後的一條記錄的重複

在List的add方法新增物件時都是最後的一條記錄的重複

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

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;
	}
	
	
	
	
}