一個奇怪的Java集合問題

小雷FansUnion發表於2015-10-26
int size = list.size();
			Integer existIndex = -1;
			for (int index = 0; index < size; index++) {
				Photo photo = list.get(index);
				// 確保不會出現多個主圖:如果已經找到了主圖,把後面的都設定為“非主圖”,防止前端驗證失敗,出現多個主圖的情況
				if (existIndex != -1) {
					photo.setCover(0);
                                       // list.set(index,photo);
				}
				Integer c = photo.getCover();
				// 找到了主圖
				if (c != null && c.equals(1)) {
					existIndex = index;
				}
			}


上週五的時候,修改集合中的1個元素,獲得第N物件,修改物件的屬性,這個時候list中的物件屬性就更改了,但是,在迴圈結束之後,發現list中的元素沒有修改,又恢復原狀了。必須通過list.set(index,photo); 才保證符合預期。


很奇怪,難道list.get,再修改不可行?

週末寫了幾個集合list的例子,發現都可以正常修改。

import java.util.ArrayList;
import java.util.List;

//測試,修改Java集合中的元素的屬性
public class ListTest {

	public static void main(String[] args) {
		List<User> list1 = buildList();
		list1.get(0).setName("name1");
		list1.get(0).setAge(1);
		System.out.println(list1.get(0));

		List<User> list2 = buildList();
		User user2 = list2.get(0);
		user2.setName("name2");
		user2.setAge(2);
		System.out.println(list2.get(0));

		for (User user : list2) {
			user.setName("name3");
			user.setAge(3);
		}
		System.out.println(list2.get(0));

		updateList(list2);
		System.out.println(list2.get(0));
	}

	private static void updateList(List<User> list2) {
		System.out.println(list2.get(0));
		if (true) {
			for (User user : list2) {
				user.setName("name4");
				user.setAge(4);
			}
			System.out.println(list2.get(0));
		}
		System.out.println(list2.get(0));
	}

	public static List<User> buildList() {
		List<User> list = new ArrayList<User>();
		User user = new User();
		user.setName("name");
		list.add(user);
		return list;
	}

}

class User {
	private String name;
	private Integer age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}

}

通過例子可以看出,list修改方式沒有問題。但是,為什麼專案中的程式碼有問題呢?


今天是週一,再次debug,發現去掉list.set(index,photo); 結果是正確的。


這樣我就搞不明白,上週五的程式碼問題呢。

無法復現問題,就只能“到此為止”了~

相關文章