출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]

List<E>를 구현하는 클래스들과 달리 Set<E>를 구현하는 클래스들은 데이터의 중복저장을 허용하지 않는다.

(단, 동일 데이터에 대한 기준은 프로그래머가 정의)

 

 

package Collection;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetTest {

	public static void main(String[] args) {

		// HashSet 인스턴스 생성 : 인스턴스를 저장하기 위한 저장 공간 생성
		// set : 집합, 저장순서 유지하지않는다.
		
		Set<String> set = new HashSet<String>();
		
		set.add("First");
		set.add("Second");
		set.add("Third");
		set.add("First");   // 중복이라 저장되지 않는다.
		

		System.out.println("set 요소의 개수 : "+ set.size());
		
		Iterator<String> itr=set.iterator();
		while(itr.hasNext()) {
			System.out.println(itr.next());
		}
	}

}

<출력>

 

set 요소의 개수 : 3
Second
Third
First

 

// Set<e>는 저장하는 순서를 가지지 않기 때문에 
// 일괄처리를 위해서는 Iterator<E> 인스턴스를 이용해서 처리한다.
// Collection<E>에는 Iterater() 메서드를 가지고 있고 Iterator<E>를 반환한다.

 

 

HashSet<E>클래스의 동등비교

String에는 Hashcode() 가 있어서 지 알아서 중복 분류해주지만 나머지는 해시코드를 만들어줘야한다

package Collection;

public class SimpleNumber {

	int num;

	public SimpleNumber(int num) {
		this.num = num;
	}

	@Override
	public String toString() {
		return String.valueOf(num);
	}
	
}
package Collection;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SimpleNumberMain {

	public static void main(String[] args) {

		// set  인스턴스 생성		
		Set<SimpleNumber> set=new HashSet<SimpleNumber>();
		
		set.add(new SimpleNumber(10));
		set.add(new SimpleNumber(20));
		set.add(new SimpleNumber(10));
		
		System.out.println("Set 요소의 개수 : "+set.size());
		
		Iterator<SimpleNumber> itr = set.iterator();
		
		while(itr.hasNext()) {
			System.out.println(itr.next());
		}

	}

}

<출력>

 

Set 요소의 개수 : 3
10
10
20

 

 

<SimpleNumber  수정>

쉬프트 알트 o > gernerate hashcode() and equals()

package Collection;

public class SimpleNumber {

	int num;

	
	// Set 동등 비교를 위한 Hashcode(), equals() 오버라이딩
	
	@Override
	public int hashCode() {
//		final int prime = 31;
//		int result = 1;
//		result = prime * result + num;
		return num%3; // 0 or 1 or 2
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) // 참조 주소값 == 전달받은 참조 주소값
			return true;
		if (obj == null) // 들어오는 객체가 null  ex) set.add(null)인 경우
			return false;
		if (getClass() != obj.getClass()) // 클래스 이름비교, 같은 타입인가
			return false;
		SimpleNumber other = (SimpleNumber) obj;
		if (num != other.num)
			return false;
		return true;
	}

	public SimpleNumber(int num) {
		this.num = num;
	}

	@Override
	public String toString() {
		return String.valueOf(num);
	}
	
}

< 출력 >

 

Set 요소의 개수 : 2
10
20

+ Recent posts