컬렉션프레임워크

컬렉션프레임워크란, 데이터를 저장하는 방법들을 표준화하여 클래스로 만든 것이다.

자료구조 프레임워크라고 봐도 될거같다.

컬렉션 프레임워크의 핵심 인터페이스

컬렉션 프레임워크에는 크게 3가지의 자료구조? 데이터를 저장하는 형식이 존재한다. 이를 인터페이스로 만들어 놓았다.

List, Set, Map 3가지의 인터페이스가 있고, List와 Set의 공통부분으로 만든 Collection인터페이스가 있다.

List인터페이스는 순서가 있고, 데이터의 중복을 허락하는 데이터의 집합이다.

구현한 클래스에는 ArrayList, LinkedList와 구버전인 Stack과 Vector가 있다.

Set인터페이스는 순서가 없고, 데이터의 중복도 허용안되는 데이터의 집합이다.

구현한 클래스에는 HashSet, TreeSet이 있다.

Map인터페이스는 key와 value를 한 쌍으로 저장하는 데이터의 집합으로 key값은 중복이 안되고, value값은 중복을 허용한다.

구현한 클래스에는 HashMap, TreeMap와 구버전인 Hashtable, Properties가 있다.

이 인터페이스의 메소드들은 p580-583을 보자. 대부분 CRUD, 비교등에 관한 내용이다.

ArrayList

ArrayList는 배열기반의 List로 데이터의 저장순서가 유지되고, 중복을 허용한다.

public class ArrayListEx1 {
    public static void main(String[] args) {
        ArrayList list1 = new ArrayList(10);
        list1.add(new Integer(5));
        list1.add(new Integer(4));
        list1.add(new Integer(2));
        list1.add(new Integer(0));
        list1.add(new Integer(1));
        list1.add(new Integer(3));

        ArrayList list2 = new ArrayList(list1.subList(1,4));
        print(list1, list2);

        Collections.sort(list1);
        Collections.sort(list2);
        print(list1, list2);

        System.out.println("list1.containsAll(list2):"+list1.contains(list2));

        list2.add("B");
        list2.add("C");
        list2.add(3,"A");
        print(list1, list2);

        list2.set(3, "AA");
        print(list1, list2);

        System.out.println("list1.retainAll(list2):"+list1.retainAll(list2));
        print(list1, list2);

        for(int i = list2.size()-1;i>=0;i--){
            if(list1.contains(list2.get(i)))
                list2.remove(i);
        }
        print(list1, list2);
    }
    static void print(ArrayList list1, ArrayList list2){
        System.out.println("list1:"+list1);
        System.out.println("list2:"+list2);
        System.out.println();
    }
}

삭제하는 for문에서 i를 감소시키며 반복시키는 이유는 삭제될 때마다 빈공간을 채우기위해 나머지 요소가 자리이동을 하기 때문에 올바르지 않은 결과가 나올 수 있다.

public class ArrayListEx2 {
    public static void main(String[] args) {
        final int LIMIT=10;
        String source="0123456789abcdefghijABCDEFGHIJ!@#$%^&*()ZZZ";
        int length = source.length();

        List list = new ArrayList(length/LIMIT+10);

        for(int i=0; i<length; i+=LIMIT){
            if(i+LIMIT<length){
                list.add(source.substring(i, i+LIMIT));
            }else{
                list.add(source.substring(i));
            }
        }
        for(int i=0; i<list.size(); i++){
            System.out.println(list.get(i));
        }
    }
}

처음 ArrayList를 생성할 때, 저장할 요소의 개수를 넉넉하게 잡는것이 좋다. 자동으로 크기를 늘여주긴 하지만 성능하락이 있기 때문이다.

LinkedList