본문 바로가기

프로그래밍/Java

Java_컬렉션 프레임웍(2)_List인터페이스_ArrayList, LinkedList, Stack과 Queue

② List인터페이스: 순서O, 중복O
- ArrayList의 메서드

메서드 설명
ArrayList() 크기가 0인 ArrayList를 생성한다.
ArrayList(Collection c) 주어진 컬렉션이 저장된 ArrayList를 생성한다.
ArrayList(int initialCapacity) 지정된 초기용량을 갖는 ArrayList를 생성한다.
boolean add(Object o) ArrayList의 마지막에 객체를 추가. 성공하면 true
void add(int index, Ojbect element) 지정된 위치(index)에 객체를 저장한다.
boolean addAll(Collection c) 주어진 컬렉션의 모든 객체를 저장한다.
boolean addAll(int index, Collection c) 지정된 위치부터 주어진 컬렉션의 모든 객체를 저장한다.
Object clone() ArrayList를 복제한다.
boolean contains(Object o) 지정된 객체(o)가 ArrayList에 포함되어 있는지 확인한다.
Object get(int index) 지정된 위치(index)에 저장된 객체를 반환한다.
int indexOf(Object o) 지정된 객체가 저장된 위치를 찾아 반환한다.
boolean isEmpty() ArrayList가 비어있는지 확인한다.
Iterator iterator() ArrayList의 Iterator객체를 반환한다.
int lastIndexOf(Object o) 객체(o)가 저장된 위치를 끝부터 역방향으로 검색해서 반환한다.
ListIterator listIterator() ArrayList의 ListIterator를 반환한다.
ListIterator listIterator(int index) ArrayList의 지정된 위치부터 시작하는 ListIterator를 반환한다.
boolean remove(Object o) 지정한 객체를 제거한다. (성공하면 true, 실패하면 false)
boolean removeAll(Collection c) 지정한 컬렉션에 저장된 것과 동일한 객체들을 ArrayList에서 제거한다.
boolean retainAll(Collection c) ArrayList에 저장된 객체 중에서 주어진 컬렉션과 공통된 것들만 남기고
나머지는 삭제한다.



- ArrayList 예제

import java.util.*;

class JavaJungsuk_CollectionFramework_ArrayList_ex11_1 {
    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));	//list1.add(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.containsAll(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.pritnln("list1:"+list1);
        System.out.println("list2:"+list2);
        System.out.println();
    }
}

결과
list1:[5, 4, 2, 0, 1, 3]
list2:[4, 2, 0]

list1:[0, 1, 2, 3, 4, 5]
list2:[0, 2, 4]	//Collections.sort(list l)를 이용해서 정렬하였다.

list1.containsAll(list2) :true	//list1이 list2의 모든 요소를 포함하고 있을 때만 true
list1:[0, 1, 2, 3, 4, 5]
list2:[0, 2, 4, A, B, C]	//add(Object obj)를 이용해서 새로운 객체를 저장

list1:[0, 1, 2, 3, 4, 5]
list2:[0, 2, 4, AA, B, C]	//set(int index, Object obj)를 이용해서 다른 객체로 변경

list1.retainAll(list2) :true	//retainAll에 의해 list1에 변화가 있었으므로 true를 반환
list1:[0, 2, 4]	//list2와의 공통요소 이외에는 모두 삭제됨.
list2:[0, 2, 4, AA, B, C]

list1:[0, 2, 4]
list2:[AA, B, C]



- ArrayList 객체 삭제

list1.remove(1);	//index가 1인 객체를 삭제.

list1.remove(new Integer(1));	//Integer 1을 삭제.

 

 

→ ArrayList에 저장된 첫번째 객체부터 삭제하는 경우. (배열 복사가 발생한다.)

 

→ ArrayList에 저장된 마지막 객체부터 삭제하는 경우. (배열 복사가 발생하지 않는다.)

 

 

 

- LinkedList 

: 링크드리스트(LinkedList)는 불연속적으로 존재하는 데이터를 연결한다. (연결리스트)

컬렉션 읽기(접근시간) 추가/삭제 비고
ArrayList(배열) 빠르다 느리다 순차적인 추가삭제는 더 빠름.
비효율적인 메모리사용
LinkedList(연결리스트) 느리다 빠르다 데이터가 많을수록 접근성이 떨어짐.

 

 

 

- Stack과 Queue

 

- Stack의 메서드

메서드 설명
boolean empty() Stack이 비어있는지 알려준다.
Object peek() Stack의 맨 위에 저장된 객체를 반환. pop()과 달리 Stack에서 객체를 꺼내지는 않음. 
Object pop() Stack의 맨 위에 저장된 객체를 꺼낸다. 
Object push(Object item) Stack에 객체(item)를 저장한다.
int search(Object o) Stack에서 주어진 객체(o)를 찾아서 그 위치를 반환한다. 
못 찾으면 -1을 반환.

 

- Queue의 메서드

메서드 설명
boolean add(Object o) 지정된 객체를 Queue에 추가한다. 성공하면 true 반환. 
Object remove() Queue에서 객체를 꺼내 반환. 
Object element() 삭제없이 요소를 읽어온다. peek와 달리 Queue가 비어있을 때 NoSuchElementException 발생.
boolean offer(Object o) Queue에 객체를 저장. 성공하면 true, 실패하면 false 반환.
Object poll() Queue에서 객체를 꺼내서 반환. 비어있으면 null 반환.
Object peek() 삭제없이 요소를 읽어온다. Queue가 비어있으면 null 반환.

 

 

- Stack과 Queue 예제

import java.util.*;

class JavaJungsuk_CollectionFramework_StackQueue {
    public static void main(String[] args) {
        Stack st=new Stack();
        Queue q=new LinkedList();	//Queue인터페이스의 구현체인 LinkedList를 사용
        
        st.push("0");
        st.push("1");
        st.push("2");
        
        q.offer("0");
        q.offer("1");
        q.offer("2");
        
        System.out.println("= Stack =");
        while(!st.empty()) {
            System.out.println(st.pop());	//스택에서 요소 하나를 꺼내서 출력
        }
        
        System.out.println("= Queue =");
        while(!q.isEmpty()) {
            System.out.println(q.poll));	//큐에서 요소 하나를 꺼내서 출력
        }
    }
}

결과
= Stack =
2
1
0
= Queue =
0
1
2

→ 위 결과를 보면 Stack은 처음 저장된 0이 제일 밑으로 가기 때문에 2 1 0 순으로 꺼내지고, 

Queue는 저장한 것과 같이 0 1 2 순으로 꺼내어진다.