List 컬렉션
List 인터페이스를 구현한 컬렉션을 말한다.
특징?
-인덱스로 관리
-중복해서 객체 저장 가능하다.
-각각의 인덱스에 "객체의 번지"가 저장이 된다.
구현클래스
ArrayList , Vector ,LinkedList
주요 메소드
-객체 추가
boolean add(E e) 주어진 객체를 맨 끝에 추가
void add(int index, E element) 주어진 인덱스에 객체를 추가
set(int index, E element) 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈
-객체 탐색
boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부
E get(int index) 주어진 인덱스에 저장된 객체를 리턴
isEmpty() 컬렉션이 비어 있는지 조사 비어있다면 true, 비어있지 않다면 false 리턴
int size() 저장되어 있는 전체 객체수를 리턴 (같은 객체 담고 있더라도 인덱스 기준)
-객체 삭제
void clear() 저장된 모든 객체를 삭제
E remove(int index) 주어진 인덱스에 저장된 객체를 삭제하고 삭제된 객체 리턴
boolean remove(Object o) 주어진 객체를 삭제
ex) 1번과 2번에 객체 B가 저장되어 있다면 1번과 2번 모두 삭제
List<String> list= ....; // List 가 저장하는 객체 타입이 String 이다. 라는 뜻
list[0] 에도 String객체 저장, list[1]에도 String객체 저장 ....
향상된 for문
for(String str : list ) { .... }
list : 컬렉션 객체
str : 컬렉션에서 하나를 가져온 객체를 저장하는 변수. list가 String을 저장하고 있기 때문에 String 변수를 선언해준것
{ .... } : list에서 객체를 하나씩 가져와서 처리를 한다.
ArrayList
-선언방법
List <E> list = new ArrayList<E>();
E는 타입파라미터로 ArrayList의 객체인 list에 저장될 타입을 지정해준다.
-저장용량(capacity)
위와 같이 길이를 지정해주지 않으면 초기 길이는 10 이다.
선언 시 용량 지정 가능하다. ex) List <E> list = new ArrayList<E>(30);
저장 용량을 초과한 객체들이 들어오면 자동적으로 늘어난다.
만약에 길이가 10인 ArrayList에 11번째 인덱스에 객체를 추가하면 용량은 +10이 자동으로 늘어나고,
11번째에 추가한 객체를 저장한다.
-객체 제거
바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.
ex) 길이가 10인 ArrayList에서 인덱스 0부터 9까지 값이 모두 입력되어 있다고 가정할때,
인덱스 4번을 삭제했다면 바로 뒤인 5번 인덱스부터 마지막인 9번인덱스까지 앞으로 1씩 당겨지고
마지막 9번이 비어있는 상태가 된다.
고정된 객체들로 구성된 List 생성
List <T> list = Arrays.asList(T ... a);
List<String> list1 = Arrays.asList("자바", "C언어", "python");
for(String name : list1)
{
System.out.println(name);
}
List<Integer> list2 = Arrays.asList(1,2,3);
for(int value : list2)
{
System.out.println(value);
}
* List<Integer> list2 = Arrays.asList(1,2,3);
타입파라미터가 Integer이므로 1,2,3(int 타입)이 저장되기 위해서는 Integer타입으로 변화되어야 하므로 자동박싱이 일어났다.
원래는 List<Integer> list2 = Arrays.asList(new Interger(1), new Integer(2), new Integer(3)); 으로 해야 한다.
하지만 편의상 1,2,3 int타입으로 써준것이고 이것은 자동박싱이 일어나서 위와같이 Integer객체를 생성하여 저장되었다.
* for(int value : list2)
list2에 저장된 객체들은 Integer타입의 객체인데, 하나씩 나오면서 변수 int value에 대입되고 있다. 이는 자동언박싱이 일어난것
Vector
-선언방법
List <E> list = new Vector<E>();
-특징
Vector는 스레드 동기화(synchronization)가 되어있기 때문에 복수의 스레드가 동시에 Vector에 접근해서 객체를 추가,삭제하더라도
스레드에 안전(thread safe)하다.
따라서 멀티스레드 환경에서는 Vector를 사용하는 것이 안전하다!
반면 ArrayList는 스레드환경에서 사용할 수 없다.
ArrayList에서 정의되어 있는 add메소드
public boolean add { ... } { ... }
Vector에서 정의되어 있는 add메소드
public synchronization boolean add { ... } { ... }
참고로 synchronization란
여러스레드가 실행되는 환경에서 하나의 스레드가 실행중이라면 다른 스레드는 실행할 수 없도록 제한하는 것
LinkedList
-선언방법
List<E> list = new LinkedList<E>();
-특징
인접 참조를 링크해서 체인처럼 관리
->이전객체 번지, 다음객체 번지, data 3개의 영역으로 나뉘어져 저장되어 있음
특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞뒤 링크만 변경
따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 좋은 성능 발휘
본 포스팅은 이것은 자바다 책을 참고하여 작성하였습니다.
'Java 공부' 카테고리의 다른 글
15장 컬렉션 프레임워크 (0) | 2019.06.05 |
---|---|
14장 람다식 (0) | 2019.05.31 |
13장 제네릭(Generic)(8)_확인문제 (0) | 2019.05.27 |
13장 제네릭(Generic)(7)_정리 (0) | 2019.05.26 |
13장 제네릭(Generic)(6)_제네릭 타입의 상속과 구현 (0) | 2019.05.25 |