1.5 Iterator, ListIterator, Enumerator
: JCF 에서는 저장된 요소를 읽어오는 방법을 표준화하였다. Iterator 인터페이스에 정의되었고, Collection 인터페이스에 Iterator 를 반환하는 iteratore() 를 정의하고 있다
List list = new ArrayList(); // 다른 컬렉션으로 변경할 때는 이 부분만 고치면 된다.
Iterator it = list.iterator();
while(it.hasNext()) {
// do sth..
}
Map 인터페이스에는 iterator 를 반환하도록 되어있지 않기 때문에,
key 나 entry 집합으로 반환한 후에 iterator 호출이 가능하다.
Iterator keyIt = map.keySet().iterator();
Iteratore entryIt = map.entrySet().iterator();
Enumeration 은 구버전으로 하위호환성을 위해 남겨두고 있을 뿐이다.
ListIterator 는 List 인터페이스를 상속받은 경우에 사용할 수 있는데, 양방향 조회 기능이 추가되었다.
Iterator 인터페이스를 구현할 때, 필수로 구현하지 않아도 되는 메소드가 있는데,
빈 블록으로 남겨놓기보다는 UnsupportedOperationException 을 던지도록 하는게 바람직하다.
1.7 Comparator와 Comparable
: 컨테이너 클래스의 기본 정렬 기준을 설정할 때는 Comparable 을 상속받아야한다. 그 외의 모든 컬렉션에 사용할 수 있도록 오름차순 정렬 객체, 내림차순 정렬 객체 등의 특별한 객체를 만들고 싶을 때는 Comparator를 구현하면 된다.
public class MyInteger extends Number implements Comparable {
// ...생략... //
public int compareTo(Object o) {
return compareTo((MyInteger)o);
}
public int compareTo(MyInteger another) {
if (this.value < another.value)
return -1;
else if (this.value == another.value)
return 0;
else
return 1;
}
}
class CompartorExample {
public static void main(String[] args) {
String[] strArr = {"cat", "dog", "lion", "tiger"};
MyInteger[] myIntergers = {1, 2, 3, 4, 5};
Arrays.sort(strArr, new Descending());
Arrays.sort(myIntegers, new Descending());
}
}
class Descending implements Comparator {
public int compare(Object o1, Object o2) {
if(o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
return c1.compareTo(c2);
}
return -1;
}
}
1.8 HashSet
- HashMap 을 상속했다.
- equals() true 이면서 hashCode() 가 서로 동일해야 같은 객체로 인식한다.
- 두 객체가 equals() true 라면 hashcode 는 동일해야 하지만, 역은 항상 성립하지 않는다.
- 두 객체가 equals() false 일때, hashcode 가 달라야 성능이 더 좋다. (같아도 상관없다. 하지만 해시충돌문제가 생길수 있다.)
1.9 TreeSet
- RedBlackTree 로 구현되어있다.
1.11 TreeMap
- 단일 검색은 HashMap 이 더 빠르지만, 정렬이나 범위검색의 경우 용이하다.
1.12 Properties
- hashTable 을 상속받아 구현했다. <String, String> 의 특수한 경우.
- list(PrintStream out), list(PrintWriter out) 메서드를 이용해서 데이터를 파일에 편리하게 출력할 수 있다.
- load(FileInputStream inputFile) 메서드를 이용하면, 정해진 형식의 파일을 쉽게 읽어올 수 있다.
- store, storeToXML 등의 메소드도 지원한다.
1.13 Collections
- synchronizedXXX : 동기화 제공. 하지만 concurrent 하지 않다.
- unmodifiableXXX : 변경 불가 컬렉션 반환
- singletonXXX
- checkedXXX : 사용할 일이 거의 없다.. 제네릭으로 해결할 수 있다.
'Java > Java의 정석' 카테고리의 다른 글
[Java의 정석] 14. 람다와 스트림 (0) | 2022.05.10 |
---|---|
[Java의 정석] 12. 제네릭스, 열거형, 어노테이션 (0) | 2022.04.04 |
[Java의 정석] 09. java.lang 패키지 (0) | 2022.03.17 |
[Java의 정석] 08. 예외 처리 (0) | 2022.03.17 |
[Java의 정석] 7.2 메소드 오버라이딩 시 예외 선언 (0) | 2022.03.14 |