자바 : 컬렉션을 반복하는 가장 좋은 방법 (여기서는 ArrayList)
오늘 저는 이미 수백 번 사용했던 코드 조각에 도달했을 때 행복하게 코딩하고있었습니다.
컬렉션 반복 (여기서는 ArrayList)
어떤 이유에서인지 이클립스의 자동 완성 옵션을 만나는데 궁금해합니다.
다음 루프가 다른 루프보다 더 나은 경우는 무엇입니까?
고전적인 배열 지붕 :
for (int i = 0; i < collection.length; i++) {
type array_element = collection.get(index);
}
반복자 hasNext () / next () :
for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
type type = (type) iterator.next();
}
그리고 작성하기가 너무 간단하기 때문에 제가 가장 좋아하는 것 :
for (iterable_type iterable_element : collection) {
}
첫 번째는 요소의 색인이 필요할 때도 유용합니다. 이것은 기본적으로 ArrayList
s 의 다른 두 가지 변형과 동일 하지만 LinkedList
.
두 번째는 요소의 색인이 필요하지 않지만 반복 할 때 요소를 제거 할 때 유용합니다. 그러나 이것은 너무 장황한 IMO라는 단점이 있습니다.
세 번째 버전도 선호하는 선택입니다. 이것은 짧고 인덱스 나 기본 반복자가 필요 하지 않은 모든 경우에 작동합니다 (즉,에 액세스하고 요소 요소를 제거하거나 Collection
어떤 식 으로든 수정하지 않는 것이 추론 일반적인 경우입니다).
그들 모두는 자신의 용도가 있습니다.
반복 가능한 항목이 모든 항목을 무조건 순회해야하는 경우 :
for (iterable_type iterable_element : 컬렉션)
iterable이 상황 부로 트래버스해야하는 경우 :
for (반복기 반복기 = collection.iterator (); iterator.hasNext ();)
데이터 구조가 iterable을 구현하지 않는 경우 :
for (int i = 0; i <collection.length; i ++)
Java 8에는 추가로 컬렉션의 스트림 () 유틸리티가 있습니다.
collection.forEach((temp) -> {
System.out.println(temp);
});
또는
collection.forEach(System.out::println);
Wonderers -link를 위한 자바 8 스트림 및 컬렉션에 대한 추가 정보
그들 중 어느 것도 다른 것보다 "더 나은"것은 없습니다. 세 번째는 나에게는 더 읽기 쉽지만은 사용하지 않는 사람에게 이상하게 보일 수 있습니다 (첫 번째를 선호 할 수 있음). 3 가지 모두 선택 자바를 이해하는 사람이라면 누구나 쉽게 좋아하는 것을 코드에 쉽게 선택할 수 있습니다.
(배열, 제가 생각할 수있는 모든 반복 가능). 그것이 제가 생각할 수있는 유일한 차이점입니다. 더 복잡한 경우 (예 : 현재 보안에 대한 액세스 권한이 필요하거나 목록을 필터링해야 함)의 경우 첫 번째 및 두 번째 경우가 더 의미가있을 수 있습니다. 간단한 경우 (반복 가능한 개체, 특별한 요구 사항 없음)의 경우 세 번째가 가장 깨끗해 보입니다.
첫 번째 옵션은 성능면에서 더 좋습니다 (ArrayList가 RandomAccess 인터페이스를 구현합니다). Java 문서에 따라 목록 구현은 클래스의 일반적인 인스턴스에 대해 루프가 다음과 같은 경우 RandomAccess 인터페이스를 구현해야합니다.
for (int i=0, n=list.size(); i < n; i++)
list.get(i);
이 루프보다 빠르게 실행됩니다.
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
도움이되기를 바랍니다. 첫 번째 옵션은 순차 액세스 목록의 경우 느립니다.
다음은 예입니다.
Query query = em.createQuery("from Student");
java.util.List list = query.getResultList();
for (int i = 0; i < list.size(); i++)
{
student = (Student) list.get(i);
System.out.println(student.id + " " + student.age + " " + student.name + " " + student.prenom);
}
'IT' 카테고리의 다른 글
서버에 동일한 Windows 서비스의 여러 인스턴스 설치 (0) | 2020.09.01 |
---|---|
localhost에서 Facebook 애플리케이션 실행 (0) | 2020.09.01 |
Assembly.GetTypes () 호출시 ReflectionTypeLoadException을 방지하는 방법 (0) | 2020.09.01 |
TFS 체크인을 롤백 어떻게하면됩니까? (0) | 2020.09.01 |
C #에서 홈 디렉토리의 경로를 얻었습니까? (0) | 2020.09.01 |