0103 TIL: 컬렉션 프레임워크 HashSet

hjern·2024년 1월 3일

자바의 정석

목록 보기
3/3

Set 인터페이스(저장 순서 X, 데이터 중복 X)

  • HashSet
    • Set인터페이스를 구현한 대표적인 컬렉션 클래스
    • 순서를 유지하려면, LinkedHashSet 클래스(순서를 유지하고 중복을 제거)를 사용하면 된다.
    • HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인한다.
    • 같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.
      • boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출
      • equals()와 hashCode()가 오버라이딩 되어 있어야 함
public static void main(String[] args) {
		Object[] objArr = {"2", "2", "1", "3", "3", new Integer(1),   "4", "4", "4"};
		Set set = new HashSet();

		for(int i=0; i< objArr.length; i++){
			set.add(objArr[i]);
		}

		// HashSet 에 저장된 요소들을 출력한다.
		System.out.println("set = " + set); 
        // set = [1, 1, 2, 3, 4]

		// 순서를 유지하고 중복을 제거
		Set set1 = new LinkedHashSet();
		for(int i=0; i< objArr.length; i++){
			set1.add(objArr[i]);
		}

		System.out.println("set1 = " + set1); 
        // set1 = [2, 1, 3, 1, 4]
	}
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));
		}

		// set = [34, 35, 23, 40, 13, 29]
		// set 은 정렬할 수가 없음
		System.out.println("set = " + set);
		// set 을 List 로 옮기고, List 를 정렬해야 함
		List list = new LinkedList(set);
		Collections.sort(list);
		System.out.println("list = " + list);
	}
public class HashSet3 {

	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)); // equals()와 hashCode() 오버라이딩으로 중복 삭제

		System.out.println("set = " + set);
	}
}


class Person {
	String name;
	int age;

	Person(String name, int age){
		this.name = name;
		this.age = age;
	}

	public String toString() {
		return name +":"+age;
	}
}

/*
set = [abc, David:10, David:10]
*/
  • equals() 와 hashCode() 를 오버라이딩 해야 HashSet 이 올바르게 작동함.
	@Override
	public boolean equals(Object obj){
	if(!(obj instanceof Person)) return false;
	Person p = (Person)obj;
	return name.equals(p.name) && age==p.age;
	}
    
	@Override
	public int hashCode(){
	return Objects.hash(name, age);
	}
    
    /*
	set = [abc, David:10]
	*/

참고자료
[자바의 정석 - 기초편] ch11-37,38 HashSet(2)
1211 TIL: equals()

profile
주니어의 굴레는 언제 벗어날 것인가

0개의 댓글