Java
[collection] List, Set, Map
berryberries
2023. 11. 2. 00:55
List, Set, Map은 자바의 컬렉션 프레임 워크의 핵심 인터페이스이다.
컬렉션 프레임워크는 다수의 객체를 다루기 위한 표준화된 프로그래밍 방식 이라고 생각하면 이해가 편하다!
한마디로 자바에서는 다수의 객체를 다룰 때 List, Set, Map을 사용해서 프로그래밍 한다.
1. List
- 데이터의 중복을 허용해준다
- 저장순서가 유지된다.
- 인덱스로 원소의 주소로 접근을 할 수 있다.
✔ 주요 구현 클래스
1) ArrayList
ArrayList<String> arraylist = new ArrayList<String>();
//add = 추가하는 메소드
arraylist.add("첫번째");
arraylist.add("A");
arraylist.add("세번째");
arraylist.add(3,"A");
System.out.println("arraylist에 담긴 문자 : " + arraylist);
// arraylist에 담긴 문자 : [첫번째, A, 세번째, A]
System.out.println("arraylist [2] : " + arraylist.get(2));
// arraylist [1] : 세번째
// set : 변경
arraylist.set(2, "수정!");
System.out.println("arraylist [2], index0f() : " + arraylist.indexOf("수정!"));
// arraylist [2], index0f() : 2
System.out.println("arraylist [2] : " + arraylist.get(2));
// arraylist [2] : 수정!
System.out.println("arraylist : " + arraylist);
// arraylist : [첫번째, A, 수정!, A]
// remove : 제거
arraylist.remove(0);
System.out.println("arraylist : " + arraylist);
// arraylist : [A, 수정!, A]
2) LinkedList
LinkedList<Integer> linked = new LinkedList<Integer>(Arrays.asList(4,5));
linked.addFirst(1);
linked.add(3);
linked.addLast(2);
System.out.println(linked);
// [1, 4, 5, 3, 2]
linked.remove(2);
System.out.println(linked);
// [1, 4, 3, 2]
// 요소로 인덱스 찾기
linked.indexOf(4);
System.out.println(linked.indexOf(4));
// 1
// 인덱스로 요소찾기
linked.get(1);
System.out.println(linked.get(1));
//4
✔ arraylist와 linkedlist의 차이점
Arraylist | LinkedList | |
추가/삭제 시간 | 느림 | 빠름 |
접근시간 | 빠름 | 느림 |
- 접근시간
- arraylist는 배열 안에 연속적으로 존재한다. + 인덱스주소로 빠르게 찾을 수 있음
- linkedlist는 불연속적으로 위치한 요소들이 서로 연결되어 있기 때문에 처음부터 n번째 까지 따라가야해서 느리다 -> 데이터 많을수록 접근성 감소
- 추가/ 삭제 시간
- arraylist는 배열의 중간에 데이터를 수정하면 배열을 복사해 삭제/추가하기 떄문에 작업시간이 증가 -> 순차으로 추가/ 삭제는 빠름
- linkedlist는 노드 연결로 이루어졌기 때문에 복사할 필요 없이 해당 노드 앞에 있는 노드와 연결을 끊고 삭제/추가 후 다시 연결해서 작업시간이 빠르다.
2. Set
- 데이터의 중복을 허용하지 않는다
- 저장순서가 유지되지 않는다
- 인덱스가 따로 없고 iterator을 사용해서 원소의 주소로 접근한다.
✔ 주요 구현 클래스
1) HashSet
HashSet<String> set = new HashSet<String>(Arrays.asList("체리"));
// add() : 추가
set.add("사과");
set.add("망고");
set.add("망고");
// 중복데이터 추가 안됨.
System.out.println("set에 들어있는 단어 : " + set); // set에 들어있는 단어 : [체리, 망고, 사과]
// remove() : 삭제
set.remove("망고");
System.out.println("set에 들어있는 단어 : " + set); // set에 들어있는 단어 : [체리, 사과]
// size() : 저장된 요소 수
System.out.println("set 크기 : " + set.size()); // set 크기 : 2
// set은 get()으로 요소를 가져올 수 없음
// -> iterator()를 사용해서 전체 객체를 한번씩 반복해서 가져와야 한다.
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
// 체리
// 사과
}
// contains() : set내부에 요소 찾기 있으면 true, 없으면 false
System.out.println(set.contains("망고")); // false
System.out.println(set.contains("사과")); // true
2) TreeSet
TreeSet<Integer> A = new TreeSet<Integer>();
A.add(1);
A.add(2);
A.add(3);
A.add(4);
A.add(5);
A.add(6);
System.out.println("A에 담긴 숫자 : " + A); // A에 담긴 숫자 : [1, 2, 3, 4, 5, 6]
System.out.println("A의 크기 : " + A.size()); // A의 크기 : 6
System.out.println("A의 최소값 : " + A.first()); // A의 최소값 : 1
System.out.println("A의 최대값 : " + A.last()); // A의 최대값 : 6
System.out.println("A에 3이 있나요? " + A.contains(3)); // A에 3이 있나요? true
System.out.println("3 이상! : "+ A.headSet(3) ); // 3 이상! : [1, 2]
System.out.println("3 이하! : "+ A.tailSet(3)); // 3 이하! : [3, 4, 5, 6]
3. Map
- key와 value 쌍으로 이루어진 데이터집합
- 저장순서가 유지되지 않는다
- key는 중복이 허용되지 않으나 value는 중복이 허용된다
✔ 주요 구현 클래스
1) HashMap
HashMap map = new HashMap();
map.put("사과", "빨강");
map.put("오렌지", "주황색");
map.put("바나나","노랑색");
System.out.println(map); // {오렌지=주황색, 사과=빨강, 바나나=노랑색}
4. 요약
인터페이스 | 특징 |
List | 순서 : 순서가 있는 데이터 집합 중복 : 데이터 중복을 허용한다 |
Set | 순서 : 순서를 유지하지 않는 데이터 집합 중복 : 중복을 허용하지 않는다 |
Map | 순서 : 순서를 유지하지 않는 데이터 집합 중복 : 키 (Key) - 중복을 허용하지 않는다 값 (Value) - 중복을 허용한다. |