Java/Java의 정석

[Java의 정석] 11. Collections Framework

동현 유 2022. 3. 23. 10:20

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 : 사용할 일이 거의 없다.. 제네릭으로 해결할 수 있다.