[Java]::Remind - Collection (Set) - 3 -

Gentlee's Self-Study Log·2023년 5월 12일
0

Java Reminder

목록 보기
11/19
post-thumbnail

Java Collection Framework

Java에서 배열에 비효율적인 문제 중 하나는 크기가 고정적이라는 것이다. 배열의 크기는 생성될 때, 크기가 정해지고 정해진 크기 이상으로 데이터를 저장할 수 없기 때문에 문제가 발생합니다. 이를 해결하기 위해 자바에서는 객체와 데이터들을 효율적으로 관리할 수 있는 자료구조를 라이브러리로 제공하는데 이것이 Collection Framework이다.


(출처-https://coding-factory.tistory.com/550)

Set Collection

Set컬렉션은 선형구조이고 추가한 순서대로 저장 순서가 유지되는 List컬렉션과 달리, 저장 순서가 유지가 안된다. 순서 자체가 없으므로 인덱스로 관리를 하지않기 때문에 get(index)메소드도 사용 못한다.
각각의 데이터가 저장될 때, 인덱스가 부여가 되는것이 아닌 특정 key값을 부여하기 때문에 순서가 없으며 저장된 값으로 key값을 부여하기 때문에 중복된 값도 저장이 안된다.

Set컬렉션은 비선형 구조이기에 순서가 없으며 인덱스도 존재하지 않습니다. 따라서 값을 추가하거나 삭제할 때에는 추가 혹은 삭제하고자 하는 값이 Set 내부에 있는지 검색 한 뒤 추가나 삭제를 해야 하므로 속도가 List구조에 비해 느리다.

대표적인 Set Collection으로는

  • HashSet
  • TreeSet

이 있다.

HashSet

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

중복을 걸러낼 때, HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode()메소드를 호출해서 해시 코드를 얻어낸 다음, 저장되어 있는 객체들의 해시 코드와 비교한 뒤 같은 해시 코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다. 문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 String객체는 동일한 객체로 간주되고 다른 문자열을 갖는 String객체는 다른 객체로 간주되는데, 그 이유는 String클래스가 hashCode()와 equals() 메소드를 재정의해서 같은 문자열일 경우 hashCode()의 리턴 값을 같게, equals()의 리턴 값은 true가 나오도록 했기 때문이다.

HashSet - 선언

HashSet<Integer> set1 = new HashSet<Integer>();
//HashSet생성
HashSet<Integer> set2 = new HashSet<>();
//new에서 타입 파라미터 생략가능
HashSet<Integer> set3 = new HashSet<Integer>(set1);
//set1의 모든 값을 가진 HashSet생성
HashSet<Integer> set4 = new HashSet<Integer>(10);
//초기 용량(capacity)지정
HashSet<Integer> set5 = new HashSet<Integer>(10, 0.7f);
//초기 capacity,load factor지정
HashSet<Integer> set6 = new HashSet<Integer>(Arrays.asList(1,2,3));
//초기값 지정

HashSet - 메소드

add(x) : 값 추가/중복된 값 있을시 false
remove(x) : x값 삭제/값 없을시 false
clear() : 모두 삭제
size() : 크기 구하기
contains(x) : 값 유무검색

HashSet - Iterator

Set컬렉션을 그래도 print하게 되면 대괄호 [ ] 로 묶여서 set의 전체 값이 출력된다. 인덱스로 출력을 못하므로 반복자(Iterator)를 이용한다.

Iterator iter = set.iterator();	// Iterator 사용
while(iter.hasNext()) {//값이 있으면 true 없으면 false
    System.out.println(iter.next());
}

TreeSet

HashSet과 같이 Set 인터페이스를 구현한 클래스로써 객체를 중복해서 저장할 수 없고 저장 순서가 유지되지 않는 Set의 성질을 갖고있다.

하지만, HashSet과의 차이점은 이진탐색트리(Binary Search Tree)구조로 되어 있기 때문에 저장과 동시에 정렬이 된다.

이진 탐색 트리는 추가와 삭제에는 시간이 조금 더 걸리지만 정렬, 검색에 높은 성능을 보이는 자료구조이기 때문에 HashSet보다 데이터의 추가와 삭제는 시간이 더 걸리지만 검색과 정렬에는 용이하다.

TreeSet은 데이터를 저장할 시 이진탐색트리(BinarySearchTree)의 형태로 데이터를 저장하기에 기본적으로 nature ordering를 지원하며 생성자의 매개변수로 Comparator객체를 입력하여 정렬 방법을 임의로 지정해 줄 수도 있습니다.

TreeSet - 값이 추가되는 과정

7,4,9,2,5를 차례대로 TreeSet에 저장하는 과정

TreeSet - 선언

TreeSet<Integer> set1 = new TreeSet<Integer>();
//TreeSet생성
TreeSet<Integer> set2 = new TreeSet<>();
//new에서 타입 파라미터 생략가능
TreeSet<Integer> set3 = new TreeSet<Integer>(set1);
//set1의 모든 값을 가진 TreeSet생성
TreeSet<Integer> set4 = new TreeSet<Integer>(Arrays.asList(1,2,3));
//초기값 지정

TreeSet - 메소드

add(x) : 값 추가/중복된 값 있을시 false
remove(x) : x값 삭제/값 없을시 false
clear() : 모두 삭제
size() : 크기 구하기
contains(x) : 값 유무검색
first() : 최소값 출력
last() : 최대값 출력
higher(x) : 입력값(x)보다 큰 데이터중 최소값 출력 없으면 null
lower(x) : 입력값(x)보다 큰 데이터중 최대값 출력 없으면 null

TreeSet - Iterator

Set컬렉션을 그래도 print하게 되면 대괄호 [ ] 로 묶여서 set의 전체 값이 출력된다. 인덱스로 출력을 못하므로 반복자(Iterator)를 이용한다.

Iterator iter = set.iterator();	// Iterator 사용
while(iter.hasNext()) {//값이 있으면 true 없으면 false
    System.out.println(iter.next());
}
profile
https://github.com/SamGentlee

0개의 댓글