下面这两种for循环中新建对象写法有什么区别呢?
第一种:
list<User> users = new ArrayList<User>();
User user = null;
for (int i = 0; i < 10; i++) {
user = new User();
user.setUserId(i);
user.setUserName("segment" + i);
users.add(user);
}
……
第二种:
list<User> users = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUserId(i);
user.setUserName("segment" + i);
users.add(user);
}
……
这两种写法对集合users中的内容有影响吗,还是只是性能上有区别?
迷茫2017-04-17 17:44:37
영향은 없으며 사용자 변수의 범위만 다릅니다.
루프의 마지막 값에 대해 특별한 처리가 필요한 경우 첫 번째 형식을 사용하고, 그렇지 않으면 두 번째 형식이 더 좋다고 생각합니다.
黄舟2017-04-17 17:44:37
첫 번째가 성능이 더 좋을 수도 있지만 이는 Java 프로그래머가 전혀 고려하지 않는 문제입니다. 직관적으로 말하면 두 번째가 코딩 표준과 가독성이 더 좋습니다.
PHP中文网2017-04-17 17:44:37
한 가지 원칙을 기억하세요. 변수는 필요할 때만 선언하고 생성해야 합니다. 그래서 : 두 번째이지만 차이는 작습니다. 효율성에 차이가 있다고 말하는 학생들은 이를 뒷받침하고 모두에게 보여줄 수 있는 데이터가 있기를 바랍니다
PHP中文网2017-04-17 17:44:37
내용은 아무런 영향을 미치지 않습니다. for 루프가 끝난 후에도 사용자는 여전히 가비지 컬렉터에 의해 재활용되지 않는 메모리 조각을 가리킵니다.
迷茫2017-04-17 17:44:37
기본적으로는 차이가 없습니다. 유일한 차이점은 참조 카운터 조정 타이밍이 약간 다르지만 객체는 항상 참조되며 GC도 트리거되지 않습니다. 그래서 이것은 실제로 아무런 차이가 없습니다.
루프 본문 내에 선언된 객체의 경우 객체를 표시하면 범위가 끝난 후 참조가 해제됩니다. 그러나 루프 외부에서 선언되면 이전 참조는 다음 할당까지 해제되지 않습니다. 컨테이너에 저장되지 않더라도 JAVA의 GC 메커니즘에서는 다음 GC 트립까지 객체가 해제되지 않습니다.
코드 가독성을 고려하면 객체는 루프 본문 내에서만 사용해야 하며, 범위가 크고 코드 복잡도가 높으면 오류가 발생하기 쉽습니다.
여전히 동일한 원칙은 필요할 때 생성한다는 것입니다.