본문 바로가기
Java/ㄴ collection*컬렉션

[Java] 💻List, Set, Map

by W_W_Woody 2022. 2. 27.
배열 / List / Set / Map 개념

 

배열

순차적 접근속도 가장 빠름.

비순차적 삽입/삭제

크기 변경 불가


List

순서O, 데이터의 중복O.

ArrayList

내부적으로 배열로 구현

배열크기 변경 가능. → 크기를 미리 모를때 사용

순차적

LinkedList

Node로 구현

비순차적 삽입/삭제에 최적

접근성이 떨어진다. (인덱스가 없으므로 처음부터 하나씩 방문해야 함)


Set

비선형 구조이기에 순서 X.(만약 요소의 저장 순서를 유지해야 한다면 JDK 1.4부터 제공하는 LinkedHashSet 클래스를 사용)

그렇기에 인덱스도 X

주머니에 구슬을 넣는 모양. (중복된 데이터를 넣으면 구분이 불가능하므로 허용하지 않는다.)

중복을 자동으로 제거해서 중복 X.

중복된 데이터가 삽입 시도 원래 데이터만 살아남고 중복된 데이터 삽입 불허.

그렇기에 값을 추가하거나 삭제할 때에는 내가 추가 혹은 삭제하고자 하는 값이 Set 내부에 있는지 검색 한 뒤 추가나 삭제를 해야 하므로 속도가 List구조에 비해 느리다.

 

Set 인터페이스를 구현한 클래스로는 HashSet과 TreeSet이 있는데

HashSet의 경우 정렬을 해주지 않고 TreeSet의 경우 자동정렬을 해준다는 차이점이 있다.

 

HashSet

hasing기법을 사용해 중복 체크 O(1)

데이터가 많을떄 빠르게 검색할수 있는 가장 좋은 자료구조
정렬을 해주지 않음

HashSet 은 자바 Collection 중 Set 의 파생클래스이다. 그렇기에 Set의 성질을 그대로 상속받는다

(Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장 또한 저장 순서가 유지되지 않는다. 만약 요소의 저장 순서를 유지해야 한다면 JDK 1.4부터 제공하는 LinkedHashSet 클래스를 사용)

 

set 을 집합이라고 생각하면 되는데, HashSet 의 경우 몇 가지 특징이 있다.

  1. 중복되는 원소를 넣을 경우 하나만 저장한다. 즉, 중복원소를 허용하지 않는다.
  2. HashSet 은 순서 개념이 없다. 따라서 Collections.sort() 메소드를 사용할 수 없다. 만약 정렬을 하고 싶다면 리스트로 변환 후 정렬해야한다.
hashSet 선언법

HashSet생성

HashSet<Integer> set = new HashSet<Integer>();  

처음 생성할 때 HashSet<Integer> 으로 타입을 Integer로 선언했기 때문에 int 형 또는 Integer 객체를 넣어주어야한다.

값을 넣을 때 만약 중복되는 값이 없으면 HashSet 에 저장되면서 True 를 반환하고,

만약 중복되어 저장되지 않으면 False 를 반환한다.

 

값 추가

set.add(1);

set.add(2);

set.add(3);

 

값 제거

set.remove(1);  //값 1 제거

set.clear();  //모든 값 제거

 

값 출력

HashSet의 크기(= 저장되어 있는 원소의 개수)를 반환한다.

System.out.println(set.size());  //set 크기(저장되어 있는 원소의 개수) : 3

System.out.println(set);  //전체출력 [1,2,3]

 

Set에는 인덱스로 객체를 가져오는 get(index) 메소드가 없습니다.

대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공합니다.

반복자 이터레이터 인터페이스를 구현한 객체를 말하는데 iterator() 메소드를 호출하면 얻을 수 있습니다.

Iterator에서 하나의 객체를 가져올 때는 next() 메소드를 사용합니다. next() 메소드를 사용하기 전에 먼저 가져올 객체가 있는지 확인하는 것이 좋습니다. 

 

Iterator iter = set.iterator();  // Iterator 사용

 

while(iter.hasNext()) { //hasNext() : 가져올 객체가 있으면 true, 없으면 false 리턴

System.out.println(iter.next()); //next() : Iterator에서 하나의 객체를 가져올 때

 

 

System.out.println(set.contains(1)); //set내부에 값 1이 있는지 check  → true

 

TreeSet

Binary Search Tree로 중복 체크 O(logN)

정렬을 자주 실행해야 하는 경우.
자동정렬을 해준다

https://coding-factory.tistory.com/554

 

[Java] 자바 HashSet 사용법 & 예제 총정리

HashSet이란? HashSet은 Set 인터페이스의 구현 클래스입니다. 그렇기에 Set의 성질을 그대로 상속받습니다. Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장할 수 있습니다. 또한 저장 순

coding-factory.tistory.com


Map

 Key : Value

"바나나" : 5000

"사과" : 5000

Value 중복O (Value로 값을 구분할 수 있기 때문에)

단, key는 중복X.

 

만약 중복 키가 들어오면 → 기존데이터 지우고 덮어쓰기.  <Set과 비교>

왜? 키는 중복되더라도 새로운 데이터가 있을수 있기 때문.

HashMap

데이터가 많을떄 빠르게 검색할수 있는 가장 좋은 자료구조

TreeMap

정렬을 자주 실행해야 하는 경우.

 

 

자바 Collecetion의 종류들은 자료구조나 알고리즘에서 많이 쓰이므로 익혀두는 것은 자바에서 필수

 

https://seungahyoo.tistory.com/71?category=1032187 

 

해시테이블 Hashtable

해시테이블 HashTable Concepts 해싱함수(hash function) 해싱함수란 데이터의 효율적 관리를 목적으로 임의의 길이의 데이터를 고정된 길의의 데이터로 매핑하는 함수. 매핑 전 데이터 값을 Key, 매핑 후

seungahyoo.tistory.com

 

'Java > ㄴ collection*컬렉션' 카테고리의 다른 글

Comparator, Comparable  (0) 2022.04.24

댓글