Hello

Java HashSet, TreeSet, HashSet의 주요 메서드

by 볼빵빵오춘기
더보기

Set 인터페이스를 구현한 대표적인 컬렉션 클래스 - HashSet, TreeSet

 

HashSet - 순서x, 중복x

  • Set 인터페이스를 구현한 대표적인 컬렉션 클래스이다.
  • 순서를 유지하려면, LinkedHashSet 클래스를 사용하면 된다.
  • 순서x, 중복x
    ⇒ HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인
    ⇒ 같은 객체가 겂으면 저장하고, 있으면 저장하지 않는다.
    ⇒ boolean add(Object o)는 저장할 객체의 equals와 hashCode()를 호출
    ⇒ 따라서 equals()와 hashCode()가 오버라이딩 되어 있어야한다.

 

TreeSet

  • 범위 검색과 정렬에 유리한 컬렉션 클래스이다.
  • HashSet보다 데이터 추가, 삭제에 시간이 걸린다.

 

HashSet의 주요 메서드

HashSet의 생성자

  • HashSet()
  • HashSet(Collection c)
  • HashSet(int initialCapacity)
  • HashSet(int initialCapacity, float loadFactor)

 

HashSet 메서드

  • boolaen add(Object o)
  • boolaen addAll(Collection c)
  • boolean remove(Object o)
  • boolean removeAll(Collection c)
  • boolean retainAll(Collection c)
  • void clear()
  • boolean contains(Object o)
  • boolean containsAll(Collection c)
  • Iterator iterator()
  • boolean isEmpty()
  • int size()
  • Object[] toArray()
  • Object[] toArray(Object[] a)

 

예제 코드

예제 코드1

더보기
import java.util.*;

public class Try {

	public static void main(String[] args) {
		Object[] objArr = {"1", new Integer(1),"2","2","3","3","4","4","4"};
		Set set = new HashSet();
		
		for(int i=0;i<objArr.length;i++) {
			set.add(objArr[i]); // HashSet에 objArr의 요소들을 저장한다.
//			System.out.println(set.add(objArr[i]); ); 
//      => 이 부분 주석처리 해제하고 보면 set에 들어갔는지 아닌지 확인가능
		}
		System.out.println(set);
		
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
	}

}

⇒ 핑크색 테두리부분이 순서가 있는것처럼 결과가 나왔지만 순서가 있진않음. 순서를 보장하지않는다!!

예제 코드2

더보기
import java.util.*;

public class Try {

	public static void main(String[] args) {
		Set set = new HashSet();
		for(int i=0;set.size()<6;i++) {
			int num = (int)(Math.random()*45)+1;
			set.add(new Integer(num));
		}

		System.out.println(list);
		// 정렬되지않은 상태에서 출력이된다.
		
		// 정렬하기위해서는 sort를 이용해야하는데 
		// 그럴려면 Collections인터페이스에 들어있는 클래스여야만 가능해서 List에 넣은 후 정렬
		List list = new LinkedList(set); // LinkedList(Collection c)
		Collections.sort(list); // Collections.sort(List list)
		System.out.println(list);
		
	}

}

예제 코드3

더보기

순서x, 중복x 

⇒ HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인

⇒ 같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.

⇒ boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출

⇒ 따라서 equals()와 hashCode()가 오버라이딩 되어 있어야함

import java.util.*;

public class Try {

	public static void main(String[] args) {
		HashSet set = new HashSet();
		
		set.add("abc");
		set.add("abc");
		set.add(new Person("David",10));
		set.add(new Person("David",10));
		
		System.out.println(set);
	}

}

class Person{
	String name;
	int age;
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	public String toString() {
		return name + " : "+ age;
	}
}

⇒ abc는 set에 2번 저장이 안된 것을 확인가능

⇒ David : 10 은 set에 2번 저장됨

why? 같은 객체인지 체크하지 않아서

⇒ equals()와 hashCode()를 오버라이딩해야 HashSet이 바르게 동작한다.

 

※ 오버라이딩 how?

직접적어도 되나 많이 사용하기 때문에 상단 메뉴탭 이용(source > Generate hashCode() and equals()… 를 선택)하거나

작성할 때 사용할 iv를 선택 창나오면 선택후 generate를 누르면 나온다. 그 후 수정해서 사용하면된다.

예제 코드4

더보기
import java.util.*;

public class Try {

	public static void main(String[] args) {
		HashSet set = new HashSet();
		
		set.add("abc");
		set.add("abc");
		set.add(new Person("David",10));
		set.add(new Person("David",10));
		
		System.out.println(set);
	}

}

class Person{
	String name;
	int age;
	
	
	@Override
	public int hashCode() {
		// Objects.hash(Object... values); => 가변 인자   
		return Objects.hash(age, name);
	}

	@Override
	public boolean equals(Object obj) {
		if(!(obj instanceof Person)) return false;
		
		Person p = (Person) obj;
		// 나자신(this)의 이름과 나이를 p와 비교 
		return this.name.equals(p.name) && this.age == p.age;
	}

	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	public String toString() {
		return name + " : "+ age;
	}
}

예제 코드5

더보기
import java.util.*;

public class Try {

	public static void main(String[] args) {
		HashSet setA   = new HashSet();
		HashSet setB   = new HashSet();
		HashSet setHab = new HashSet();
		HashSet setKyo = new HashSet();
		HashSet setCha = new HashSet();

		setA.add("1");	 setA.add("2");  setA.add("3");
		setA.add("4");  setA.add("5");
		System.out.println("A = "+setA);

		setB.add("4");	 setB.add("5");  setB.add("6");		
      setB.add("7");  setB.add("8");
		System.out.println("B = "+setB);

		Iterator it = setB.iterator();
		while(it.hasNext()) {
			Object tmp = it.next();
			if(setA.contains(tmp))
				setKyo.add(tmp);
		}

		it = setA.iterator();
		while(it.hasNext()) {
			Object tmp = it.next();
			if(!setB.contains(tmp))
				setCha.add(tmp);
		}

		it = setA.iterator();
		while(it.hasNext())
			setHab.add(it.next());

		it = setB.iterator();
		while(it.hasNext())
			setHab.add(it.next());

		System.out.println("A ∩ B = " + setKyo);  // 한글 ㄷ을 누르고 한자키
		System.out.println("A U B = " + setHab);  // 한글 ㄷ을 누르고 한자키
		System.out.println("A - B = " + setCha); 
	}

}

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기