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