비슷한 무리의 클래스를 보게되면 > 인터페이스를 볼 것 > 처음 보더라도 기존에 사용하던 기능이 들어있을 수 있음. > 컬렉션
List
- ArrayList, Stack, Queue, LinkedList, (Properties)
Set
- HashSet, TreeSet
Map
- HashMap, TreeMap, (HashTable)
순차적으로 추가/삭제 작업 시간
중간 추가/삭제 작업 시간
public class Ex75_LinkedList {
public static void main(String[] args) {
//ArrayList vs LinkedList
ArrayList<Integer> list1 = new ArrayList<Integer>();
LinkedList<Integer> list2 = new LinkedList<Integer>();
//요소 추가(Append)
list1.add(100);
list1.add(200);
list1.add(300);
list2.add(100);
list2.add(200);
list2.add(300);
//요소 접근 get() -> 겉으로는 구분 어려움. 내부적인 메모리 차이만 있음.
for (int i=0; i<list1.size(); i++) {
System.out.println(list1.get(i));
}
for (int i=0; i<list2.size(); i++) {
System.out.println(list2.get(i));
}
//장단점 테스트 : 특정 작업의 시간 재기
long begin = 0, end = 0;
//1. 순차적으로 데이터를 추가하기(Append) -> 둘 다 크게 느껴지는 차이는 없음
System.out.println("1. 순차적으로 데이터를 추가하기, Append");
begin = System.currentTimeMillis(); //tick
//ArrayList 작업
for (int i=0; i<1000000; i++) {
list1.add(i);
}
end = System.currentTimeMillis(); //tick
System.out.printf("ArrayList 작업시간: %,dms\n", end-begin); //38ms
begin = System.currentTimeMillis(); //tick
//LinkedList 작업
for (int i=0; i<1000000; i++) {
list2.add(i);
}
end = System.currentTimeMillis(); //tick
System.out.printf("LinkedList 작업시간: %,dms\n", end-begin); //210ms
//2. 배열 중간에 데이터 추가하기, Insert(Right Shift 발생)
System.out.println("2. 배열 중간에 데이터 추가하기, Insert(Right Shift 발생)");
begin = System.currentTimeMillis(); //tick
//ArrayList 작업
for (int i=0; i<10000; i++) {
list1.add(0, i);
}
end = System.currentTimeMillis(); //tick
System.out.printf("ArrayList 작업시간: %,dms\n", end-begin); //2,247ms -> 중간에 추가 느림
begin = System.currentTimeMillis(); //tick
//LinkedList 작업
for (int i=0; i<10000; i++) {
list2.add(0, i);
}
end = System.currentTimeMillis(); //tick
System.out.printf("LinkedList 작업시간: %,dms\n", end-begin); //1ms -> 빠름
//3. 배열 중간에 있는 데이터 삭제하기, Delete(Left Shift 발생)
System.out.println("3. 배열 중간에 있는 데이터 삭제하기, Delete(Left Shift 발생)");
begin = System.currentTimeMillis(); //tick
//ArrayList 작업
for (int i=0; i<10000; i++) {
list1.remove(0);
}
end = System.currentTimeMillis(); //tick
System.out.printf("ArrayList 작업시간: %,dms\n", end-begin); //1,748ms
begin = System.currentTimeMillis(); //tick
//LinkedList 작업
for (int i=0; i<10000; i++) {
list2.remove(0);
}
end = System.currentTimeMillis(); //tick
System.out.printf("LinkedList 작업시간: %,dms\n", end-begin); //1ms
//4. 순차적으로 데이터 삭제하기. 끝 -> 처음 (Shift 발생 안함) -> 이동할 일이 없음
System.out.println("4. 순차적으로 데이터 삭제하기. 끝 -> 처음 (Shift 발생 안함)");
begin = System.currentTimeMillis(); //tick
//ArrayList 작업
for (int i=list1.size()-1; i>=0; i--) {
list1.remove(i);
}
end = System.currentTimeMillis(); //tick
System.out.printf("ArrayList 작업시간: %,dms\n", end-begin); //9ms
begin = System.currentTimeMillis(); //tick
//LinkedList 작업
for (int i=list1.size()-1; i>=0; i--) {
list2.remove(i);
}
end = System.currentTimeMillis(); //tick
System.out.printf("LinkedList 작업시간: %,dms\n", end-begin); //0ms
}
}
public class Ex76_Collection {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("사과");
list.add("바나나");
list.add("포도");
list.add("딸기");
list.add("귤");
list.add("복숭아");
list.add("참외");
//M1. 일반 for문 -> index 사용O
for (int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println();
//M2. 향상된 for문 -> index 사용X
for (String item : list) {
System.out.println(item);
}
System.out.println();
//M3. Iterator -> index 사용X ★★★★
// - ArrayList는 Iterator를 지원한다.
// - iter: 탐색기(판독기)
// a. hasXXX() : 다음에 읽을 요소가 존재하는 지 확인
// b. nextXXX() : 다음 요소를 읽어와라(소비)
Iterator<String> iter = list.iterator();
//있으면 읽고 없으면 종료 -> iterator를 통한 컬렉션 탐색 -> 향상된 for문과 비슷 -> 향상된 for문 내부에 iterator사용
while (iter.hasNext()) {
System.out.println(iter.next()); //사과, 바나나, 포도, 딸기, 귤, 복숭아, 참외 -> 한번 읽으면 다시 되돌아갈 수 없다.
}
System.out.println();
// System.out.println(iter.hasNext()); //true
// System.out.println(iter.next()); // 사과
//
// System.out.println(iter.hasNext()); // true
// System.out.println(iter.next()); // 바나나
//
// System.out.println(iter.hasNext()); // true
// System.out.println(iter.next()); // 포도
//
// System.out.println(iter.hasNext()); // true
// System.out.println(iter.next()); // 딸기
//
// System.out.println(iter.hasNext()); // true
// System.out.println(iter.next()); // 귤
//
// System.out.println(iter.hasNext()); // true
// System.out.println(iter.next()); // 복숭아
//
// System.out.println(iter.hasNext()); // true
// System.out.println(iter.next()); // 참외
//
// System.out.println(iter.hasNext()); // false
// System.out.println(iter.next()); // 에러
}
}
public class Ex76_Collection {
public static void main(String[] args) {
//HashMap -> 탐색
HashMap<String,String> map = new HashMap<String,String>(); // -> 데이터의 순서는 우리가 관여할 수 없다.
map.put("과장", "홍길동");
map.put("사원", "아무개");
map.put("대리", "하하하");
map.put("부장", "호호호");
//탐색+ 접근
//set -> 순서가 없다.(방번호를 사용하는 메소드가 없다.) -> 탐색 못함 -> iterator제공
Set<String> set = map.keySet(); // 키 집합 반환
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
//키 출력 + 값 출력??
//System.out.println(iter.next()); //키
//System.out.println(map.get(iter.next())); //값
//동일한 키와 동일한 값을 보고 싶다면 커서를 한번만 움직여야한다!!!
String key = iter.next();
System.out.println(key);
System.out.println(map.get(key));
}
}