복습: 자바는 인터페이스, 구현클래스를 제공하는 컬렉션 프레임워크를 java.util패키지에서 제공한다.
List 컬렉션
배열과 공통점 : 인덱스로 객체를 관리
배열과 차이점 : 저장용량 (자동증가, 자동인덱스부여) / 다양한 메소드 제공 (추가, 삭제, 검색 등)
※객체 자체를 저장 x
계속 그랬듯이 '객체의 번지를 참조' => 그래서 동일객체를 중복 저장할 수 있다. (동일한 번지를 참조)
null도 저장이 가능하고, 이 때 해당 인덱스는 당연히 객체를 참조하지 않음
+List컬렉션은 힙 영역에 있다. (배열과 마찬가지)
List컬렉션에는 ArrayList, Vector, LinkedList
<<List컬렉션에서 공통적으로 사용가능한 List인터페이스의 메소드>>
*아래 표에서 E는 타입 파라미터이다.
기능 | 메소드 | 설명 |
객체 추가 | boolean add(E e) | 객체를 맨 끝에 추가 |
void add(int index, E element) | 주어진 인덱스에 객체를 추가 | |
E set(int index, E element) | 그 인덱스에 있는 객체를 주어진 객체로 바꾸기 | |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어있는지 조사하기 |
E get(int index) | 그 인덱스에 저장된 객체 리턴 | |
boolean isEmpty() | 컬렉션이 비어있는지 조사하기 | |
int size() | 저장된 전체객체수를 리턴 | |
객체 삭제 | void clear() | 저장된 모든 객체 삭제 |
E remove(int index) | 그 인덱스에 저장된 객체 삭제 | |
boolean remove(Object o) | 주어진 객체를 삭제 |
타입 파라미터는 List컬렉션 객체를 생성할때 < >안에 써서 결정해준다.
List컬렉션에 저장되는 객체를 String타입으로 해본다면
List<String> list = ...;
list.add("애우니");
list.add(1, "양마초");
String str = list.get(1);
list.remove(0);
list.remove("양마초");
이렇게 List컬렉션 객체를 String으로 선언하고 시작한다면
타입 파라미터 E로 표시된 매개값, 리턴값이 문자열이 된다.
★List컬렉션에 저장된 모든 객체를 하나씩 가져와 처리하는 방법★
1) 인덱스를 이용하는 법
2) 향상된 for문을 이용하는 법
☆인덱스 이용해서 List컬렉션의 객체 처리
List<String> list = ...;
for(int i=0; i<list.size(); i++) {
String str = list.get(i); //i인덱스에 저장된 String객체를 가져옴
☆향상된 for문 이용하여 String객체를 str변수에 대입
for(String str : list) {
}
//String객체를 하나씨가 가져오면서, 저장된 총객체 수만큼 루핑
ArrayList, Vector, LinkedList 학습하자.
ArrayList
*E는 타입 파라미터
List<E> list = new ArrayList<E>();
기본 생성자로 ArrayList객체를 생성하면 -> 초기 용량이 지정된다 (내부에 10개 객체 저장가능)
저장되는 객체 수 늘어나면 용량은 자동으로 증가한다.
>>String을 저장하는 ArrayList 호출하기
List<String> list = new ArrayLIst<String>();
List<String> list = new ArrayList<>();
ㄴ기본 생성자로 호출: 10개 객체 초기용량을 가짐 (저장객체 늘어나면 용량 자동 증가)
ㄴ중간에 객체 하나 제거하면 뒷 인덱스들이 앞으로 1씩 쭉 당겨짐
ㄴ그래서 객체를 추가, 제거할 일이 빈번하면 ArrayList보다는 LinkedList가 좋다.
ㄴ인덱스를 통해 객체를 찾거나, 맨 마지막에 객체를 추가하는 기능을 쓴다면 ArrayList가 좋다.
List인터페이스의 컬렉션클래스(구현클래스)인 ArrayList : List인터페이스의 메소드를 이용 가능하다.
Vector
ㅇArrayList와 동일한 내부구조
ㄴ차이점: Vector는 동기화된 메소드로 구성되어 있음. ->멀티스레드가 동시에 Vector의 메소드를 이용할 수 없다. (하나의 스레드가 메소드 실행을 완료해야만 함)
===>멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다. 스레드에 안전하다. (thread safe)
LinkedList
ㅇArrayList와 사용 방법은 같지만 내부구조는 완전히 다르다.
인접 링크를 참조해서 체인처럼 관리한다!
ㄴ중간에 객체를 삽입, 제거할 경우 앞뒤 링크를 끊고 새로 연결한다. 링크를 수정한다. 앞뒤 링크 정보만 변경하면 되니까 LinkedList가 빠르다.
ㄴ끝에서부터 순차적으로 인덱스변경되지 않도록 추가/삭제하는 경우에는 ArrayList가 빠르다.
<<성능비교>>
빈번한 객체의 수정이 일어날 때의 ArrayList와 LinkedList의 성능 비교를 해보자.
0번 인덱스에 String객체 10000번 추가할 때 실행 시간 비교
확인문제 07
'JAVA' 카테고리의 다른 글
[4주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.08.02 |
---|---|
[혼자 공부하는 자바] 8/1 13-1 [Set 컬렉션] [Set 인터페이스] [HashSet] (0) | 2020.08.02 |
[혼자 공부하는 자바] 7/31 13-1 [컬렉션 프레임워크] (0) | 2020.07.31 |
[혼자 공부하는 자바] 7/30 12-2 [스레드 제어] [스레드 일시정지] [sleep()] [안전한 종료] [interrupt()] [InterruptedException] [주스레드] [데몬스레드] (0) | 2020.07.31 |
[혼자 공부하는 자바] 7/29 12-1 [스레드] [멀티 스레드] [프로세스] [작업 스레드] [메인 스레드] [공유객체] [동기화메소드] (0) | 2020.07.29 |