본문 바로가기

비트교육센터[전문가반]

HashSet에서 중복 데이터 처리(equals())

package queue

 

import java.util.HashSet

 

public class Test {

public static void main(String[] args) {

 

String s1 = "abc";

String s2 = "abc";

 

System.out.println(s1.equals(s2)); //true

System.out.println(s1 == s2); //true ==> 같은 주소값에 있는 "abc"를 바로보고 있다.

 

String p1 = new String("abc");

String p2 = new String("abc");

 

System.out.println(p1.equals(p2)); //true

System.out.println(p1 == p2); //false ==> 다른 주소값에 있는 서로 다른 "abc"를 보고있다.

 

HashSet set = new HashSet();

 

//set에 들어갈때 중복검사하는데 중복검사시 사용하는 함수는 equals()함수이다.

set.add("dog"); //String과 기본 자료형은 equals()로 비교하여 같기때문에 set에서 중복이라 여겨 하나만 나온다.

set.add("dog");

System.out.println(set);

 

set.add(new String("def"));

set.add(new String("def"));

System.out.println(set);

 

Person p3 = new Person("kim", 10);

Person p4 = new Person("kim", 10);

System.out.println(p3.equals(p4));

set.add(p3);

set.add(p4); // set에 넣을때 객체를 equals로 비교했을때 p3와 p4는 주소가 다르기때문에 서로 다르다고 나와서

               //객체 내의 데이터는 중복되도 set에 들어갈수있게 된다.

System.out.println(set);

}

}

 

class Person{

String name;

int age;

 

public Person(String name, int age) {

this.name = name;

this.age = age;

}

 

public String toString() {

return name + ", " + age;

}

}

 

만약 p3 와 p4의 데이터가 같으면 HashSet에 넣지 않으려면

1. equals(Object o)메소드를 오버라이딩 해서 재정의 해주고,

2. hashCode()메소드도 오버라이딩을 해주면 된다. 

 

public boolean equals(Object obj) {

   if(obj instanceof Person) {

      Person tmp = (Person)obj;

      return name.equals(tmp.name);

   }

   return false;

}

 

public int hashCode() {

   return name.hashCode();

}

 

 

 

*참고.

TreeSet으로 만들때는 객체의 정보까지 중복을 찾아내 처리하기에 객체내의 정보가 같다면 TreeSet에 추가할 수 없다.

==> 따라서 TreeSet은 기본형 데이터, 참조형 데이터 모두 중복을 검사해서 추가한다.