Iterator i = c.iterator();
while(i.hasNext()){
doSomething(i.next());
} ....
Iterator i2 = c2.iterator();
while(i.hasNext()){ //버그!
doSomething(i2.next());
}
// 두번째 반복문의 실행시에도 i는 유효하므로 문제없이 컴파일, 동작함으로 인해 찾기어려운 버그
//그러나 for문의 경우 컴파일시 오류
for(Iterator i = c.iterator();i.hasNext();){
doSomething(i.next());
} ....
for(Iterator i2 = c2.iterator();i.hasNext();){ //the symbol i cannot be resolved 발생
doSomething(i2.next());
}
for(int i=0;i<list.size();i++){
doSomething(list.get(i)); //매번 size()를 호출한다.
}
//임의접근(random access)리스트를 순회하는 구현패턴. 임의접근에만 사용
for(int i=0, n=list.size(); i<n;i++){
doSomething(list.get(i));
}
//두번째 반복변수 n을 쓰는 것에 유의
// 이변수를 쓰지 않을 경우, 매번 size메소드를 호출하여 성능 저하
– random access : 비순차적 접근, 어떤 데이터를 기억 장소에 써 넣거나 거기에서 읽어 낼 때에, 기억 장소에 관계없이 동일한 접근 시간이 걸리는 접근 방식. ≒랜덤 액세스- 임의 접근.
순차적접근에 사용할 경우, O(n2)알고리즘의 양상을 보임(성능저하) <그림>
O(n2) - 이중 루프 내에서 입력 자료를 처리하는 경우에 나타남
![]() |
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Hashtable h1 = new Hashtable();
Hashtable h2 = new Hashtable();
h1.put("01", "1");h1.put("02", "1");h1.put("03", "1");h1.put("04", "04");
h2.put("01", "1");h2.put("02", "1");h2.put("03", "1");h2.put("04", "3");
Map tmp = new HashMap(h1);
tmp.entrySet().retainAll(h2.entrySet());
Set result = tmp.keySet();
for(Iterator i = result.iterator();i.hasNext();){
System.out.println(i.next());
}
}
}
(p.197~199)
String 클래스 대신 StringBuffer(append()) 클래스 사용
컴파일 시점에 없는 클래스를 써야 하는 프로그램을 만들 때, 가능하면 인스턴스 생성시에만 리플랙션을 쓰고, 인스턴스에 대한 접근은 컴파일 시점에 이미 알려진
인터페이스나 상위 추상클래스를 쓰는 것이 좋다. (p.211)
① 레지스트리나 파일락과 같은 플랫폼 종속적인 기능에 접근할 때
② 레거시에 존재하는 데이터에 접근하기 위해 레거시 언어로 작성한 라이브러리에 접근할때
③ 성능에 민감한 부분을 네이티브 언어로 작성하여 성능을 높일 때
-java 플랫폼의 발전, JVM의 성능향상, 다양한 기능제공으로 네이티브메소드 사용 필요가 줄어듬
-단점 : 네이티브언어가 안전하지 못함(항목24)로 인해 메모리에 신경써야함. 플랫폼 종속적, 작성 난이, 가독성저하 등
http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.8