for each 특징
1. 배열의 값을 가져다만 사용할 수 있고 수정할 수 없다. Only read
2. 내부적인 Iterator을 생성해서 사용
3. for문과 구현 방식에 대한 성능 차이는 없다.(List 제외)
4. 인덱스를 사용할 수 없다.
평범한 for문 구조
String[] numbers = {"one", "two", "three"};
for(int i=0; i<numbers.length; i++) { //평범한 for문 출처 "점프 투 자바"
System.out.println(numbers[i]);
}
for each문 구조
String[] numbers = {"one", "two", "three"};
for(String number: numbers) { //for each 문
System.out.println(number);
}
for (type var: iterate) {
body-of-loop
}
ArrayList vs LinkedList 시간복잡도 차이
import java.util.ArrayList;
import java.util.LinkedList;
public class ListTest {
public static void main(String[] args) {
long beforeTime, afterTime;
ArrayList<Integer> Alist = new ArrayList<Integer>();
LinkedList<Integer> Llist = new LinkedList<Integer>();
for(int i = 0; i < 100000; i++){
Alist.add(i);
Llist.add(i);
}
beforeTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++){
Alist.get(i);
}
afterTime = System.currentTimeMillis();
System.out.println("ArrayList 수행시간 : " + (afterTime - beforeTime));
beforeTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++){
Llist.get(i);
}
afterTime = System.currentTimeMillis();
System.out.println("LinkedList 수행시간 : " + (afterTime - beforeTime));
}
}
ArrayList 수행시간 : 1
LinkedList 수행시간 : 3769
LinkedList에서 for문을 사용하면 안되는 이유
- 배열은 index크기만큼 더해서 값에 접근함 (0번의 주솟값 + 배열 한 칸의 byte 크기 = 찾으려는 공간)
- 연결리스트는 고정된 변화값으로 주소값이 연속되지 않음 주소가 불연속적 : 따라서 시간 복잡도 O(n^2)
LinkedList에서 for each 사용
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
public class ListTest {
public static void main(String[] args) {
long beforeTime, afterTime;
ArrayList<Integer> Alist = new ArrayList<Integer>();
LinkedList<Integer> Llist = new LinkedList<Integer>();
for(int i = 0; i < 100000; i++){
Alist.add(i);
Llist.add(i);
}
beforeTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++){
Alist.get(i);
}
afterTime = System.currentTimeMillis();
System.out.println("ArrayList for 수행시간 : " + (afterTime - beforeTime));
beforeTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++){
Llist.get(i);
}
afterTime = System.currentTimeMillis();
System.out.println("LinkedList for 수행시간 : " + (afterTime - beforeTime));
beforeTime = System.currentTimeMillis();
for(int i : Llist){
//int sum += i; TODO
}
afterTime = System.currentTimeMillis();
System.out.println("LinkedList for-each 수행시간 : " + (afterTime - beforeTime));
}
}
ArrayList for 수행시간 : 1
LinkedList for 수행시간 : 3564
LinkedList for-each 수행시간 : 4
Iterator ?
자바 컬렉션에 저장되어 있는 요소들을 순화하는 인터페이스
요소에 대해 내부적으로 객체를 생성한 후 순차적으로 조회한다.
사용법이 쉽지만 객체를 생성하는 부분에서 시간이 걸린다.
Collection ?
자바에서 제공하는 자료구조들의 인터페이스, List, ArrayList, Stack, Queue, LinkedList 등이 있다.
따라서 이러한 컬렉션 인터페이스를 상속받는 클래스들에 대해 Iterator 인터페이스 사용이 가능하다.
List Iterator ?
Iterator 인터페이스에서 List에 맞게 기능이 추가된 인터페이스이다. 추가, 요소 대체, 역방향 접근, 앞/뒤 인덱스 확인 등
사용 상황 : List요소의 수정이 필요한 경우에 사용한다.
for, for each, Iterator, forEach(),,, 더 알아보기
list . foreach? (Stream API)
for each vs 이터레이터
참조 : https://www.geeksforgeeks.org/how-to-iterate-linkedlist-in-java/