[Collection] Set_HashSet/TreeSet

🛒 Set 컬렉션

  1. 요소의 저장 순서를 유지하지 않는다.
    -> 요소의 저장 순서를 유지해야 한다면 LinkedHashSet을 이용
  2. 같은 요소의 중복 저장을 허용하지 않는다.
    -> 여러개의 null이 존재할 때, 하나의 null값만 저장
  3. 순서가 없으므로 인덱스로 객체를 검색해서 가져오는 get메서드가 존재하지 않는다.
    -> 반복자(Iterator)를 사용
  4. List구조에 비해 느리다.
    -> 값을 추가/삭제시에 그 값이 있는지 검색 한 뒤 추가/삭제 해주기 때문에
  5. 대표적으로 Set인터페이스의 구현 클래스로 HashSetTreeSet이 있다.

🛒 HashSet

1.해시 알고리즘(hash algorithm)을 사용하여 검색 속도가 매우 빠르다.
-> 내부적으로 HashMap 인스턴스를 이용하여 요소를 저장
2. 객체를 저장하기 전 hashCode()메소드를 호출하여 객체의 해시코드를 얻어 내어 저장되어 있는 객체들의 해시 코드와 비교한다. 같은 해시 코드가 있다면 다시 equals() 메서드로 두 객체를 비교해 true가 나오면 동일 객체로 판단하고 저장을 하지 않는다.
🔎 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을 기본으로 생성했을때에는 initial capacity(16), load factor(0.75)의 값을 가진 HashSet객체가 생성된다.
    -> 저장된 element의 수 == 저장용량 * load factor
  • HashSet도 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 늘리는데, Set은 한 칸씩 저장공간을 늘리지 않고 저장용량을 약 두배로 늘린다.
    -> 과부하가 많이 발생한다. 그렇기에 초기에 저장할 데이터 갯수를 알고 있다면 Set의 초기용량을 지정해주는 것이 좋다.

🛒 HashSet 값 추가/삭제

HashSet<Integer> set = new HashSet<Integer>();//HashSet생성

set.add(1); //값 추가
set.add(2);

System.out.println(set.size());//set 크기 : 2

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

🛒 HashSet 값 출력

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));//HashSet생성

System.out.println(set); //전체출력 [1,2,3]
		
Iterator iter = set.iterator();	// 반복자(Iterator) 사용
while(iter.hasNext()) {//다음 객체가 있으면 true 없으면 false
    System.out.println(iter.next());
}

🛒 HashSet 값 검색

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));//HashSet생성
System.out.println(set.contains(1)); //set내부에 값 1이 있는지 true

🛒 TreeSet

  1. 이진 탐색 트리 구조로 추가/삭제에 시간이 걸리지만 정렬/검색에 높은 성능을 보인다.
    ->Comparator객체를 입력하여 정렬 방법을 임의로 지정가능

🛒 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));//초기값 지정
  • HashSet과는 다르게 선언 시 크기를 지정해 줄 수 없다.

🛒 TreeSet 값 추가/삭제

TreeSet<Integer> set = new TreeSet<Integer>();//TreeSet생성
set.add(1); //값추가
set.add(2);
set.add(3);

System.out.println(set.size());//크기 : 3

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

🛒 TreeSet 값 출력

TreeSet<Integer> set = new TreeSet<Integer>(Arrays.asList(4,2,3));//초기값 지정
System.out.println(set); //전체출력 [2,3,4]
System.out.println(set.first());//최소값 출력
System.out.println(set.last());//최대값 출력
System.out.println(set.higher(3));//입력값보다 큰 데이터중 최소값 출력 없으면 null
System.out.println(set.lower(3));//입력값보다 작은 데이터중 최대값 출력 없으면 null
		
Iterator iter = set.iterator();	// 반복자(Iterator) 사용
while(iter.hasNext()) {//값이 있으면 true 없으면 false
    System.out.println(iter.next());
}

🛒 TreeSet 값 검색

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));//HashSet생성
System.out.println(set.contains(1)); //set내부에 값 1이 있는지 true

🛒Set 인터페이스 메소드

Set 인터페이스는 Collection 인터페이스를 상속받으므로, Collection 인터페이스에서 정의한 메소드 모두 사용 가능

메서드설명
boolean add(E e)해당 집합(set)에 전달된 요소를 추가
void clear()모든 요소를 제거
boolean contains(Object o)전달된 객체를 포함하고 있는지를 확인함
boolean equals(Object o)전달된 객체가 같은지를 확인
boolean isEmpty()집합이 비어있는지를 확인
Iterator iterator()반복자(iterator)를 반환
boolean remove(Object o)전달된 객체를 제거
int size()요소의 총 개수를 반환
Object[] toArray()모든 요소를 Object 타입의 배열로 반환

좋은 웹페이지 즐겨찾기