이 문제에는 두 가지 일반적인 원인이 있습니다.
목록에 저장 한 개체에서 사용하는 정적 필드
실수로 동일한 개체를 목록에 추가
정적 필드
목록의 개체가 정적 필드에 데이터를 저장하는 경우 목록의 각 개체는 동일한 값을 보유하므로 동일하게 나타납니다. 아래 클래스를 고려하십시오.
public class Foo {
private static int value;
public Foo(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
이 예제에서는 선언 int value
되어 Foo
있기 때문에의 모든 인스턴스간에 공유되는 하나만 static
있습니다. ( "클래스 멤버 이해" 참조 자습서를 .)
Foo
아래 코드를 사용하여 목록 에 여러 개체를 추가하면 각 인스턴스가에 3
대한 호출에서 반환 됩니다 getValue()
.
for (int i = 0; i < 4; i++) {
list.add(new Foo(i));
}
해결책은 간단 static
합니다. 실제로 해당 클래스의 모든 인스턴스간에 값을 공유하려는 경우가 아니면 클래스의 필드에 키워드를 사용하지 마십시오 .
동일한 개체 추가
목록에 임시 변수를 추가하는 경우 반복 할 때마다 추가중인 객체의 새 인스턴스를 만들어야합니다. 다음 오류 코드 스 니펫을 고려하십시오.
List<Foo> list = new ArrayList<Foo>();
Foo tmp = new Foo();
for (int i = 0; i < 3; i++) {
tmp.setValue(i);
list.add(tmp);
}
여기서 tmp
객체는 루프 외부에서 생성되었습니다. 결과적으로 동일한 개체 인스턴스 가 목록에 세 번 추가됩니다. 인스턴스는 2
에 대한 마지막 호출 중에 전달 된 값이기 때문에 값을 보유합니다 setValue()
.
이 문제를 해결하려면 개체 구성을 루프 내부로 이동하면됩니다.
List<Foo> list = new ArrayList<Foo>();
for (int i = 0; i < 3; i++) {
Foo tmp = new Foo();
tmp.setValue(i);
list.add(tmp);
}