Collections - Set

jinkyung·2021년 1월 15일
0

JAVA2

목록 보기
27/35

set

: 순서 x 중복데이터 x

package ex05.collections.set06;

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

public class HashSetEx {
	public static void main(String[] args) {
		HashSet<String> hSet = new HashSet<String>();
		hSet.add("홍길동");
		hSet.add("임꺽정");
		hSet.add("장길산");
		hSet.add("홍길동");
		
		System.out.println("데이터 수 : " + hSet.size());
		
		// 반복자로 접근 
		// 어떤 컬렉션이든 모두 처음부터 끝까지 접근할 때
		// 동일한 방식으로 접근하게 표준화해놓은 방식 
		Iterator<String> itr = hSet.iterator();
		while(itr.hasNext())
			System.out.println(itr.next());
	}

}
package ex05.collections.set09;


//HashSet,  TreeSet : Data의 중복을 허용하지 않음 
//HashMap,  TreeMap : key 값의 중복을 허용하지 않음 
//HashTable : HashMap과 동일하지만 Thread-safe한 자료형 


/*
동일한 데이터의 기준은 ? -- 두가지 충족시 동일한 데이터. 
1단계) Object로부터 상속받은 HashCode()의 값을 비교해서 판단 
2단계) Object로부터 상속받은 equals()메서드의 반환값으로 판단 
 */

class Human{
	private String name;
	private int age;
	
	
	Human(String name, int age){
		this.name = name;
		this.age = age;
	}
}


public class HashSetEx {
	public static void main(String[] args) {
		Human hu = new Human("홍길동",24);
		System.out.println("객체 : "+hu);
		System.out.println("toString() : "+ hu.toString());
		System.out.println("10진수 hashCode() : "+hu.hashCode());	
		System.out.println("16진수 hashCode(): "+ Integer.toHexString(hu.hashCode()));
		System.out.println();
		
		Human hu1 = new Human("홍길동",24);
		System.out.println("객체 : "+hu1);
		System.out.println("toString() : "+ hu1.toString());
		System.out.println("10진수 hashCode() : "+hu1.hashCode());	
		System.out.println("16진수 hashCode(): "+ Integer.toHexString(hu1.hashCode()));
		System.out.println();
	}	
}
package ex05.collections.set11;

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

/*
<HashSet/HashMap은 2단계가 같으면 같은 데이터로 판단>
1단계 : hashCode() 값이 같은지		-hash라는 알고리즘은 무한한 데이터를 유한한 크기로 줄여버림, 드물지만 충돌가능성 o 
2단계 : equals()의 반환값이 같은지    -그래서 2단계를 둬서 정확한 데이터를 비교할 수 있도록 하는 것임. 

Overriding 해서 재정의해서 비교한다. 
*/

class Human{
	private String name;
	private int age;
	
	Human(String name, int age){
		this.name = name;
		this.age = age;
	}

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

public class HashSetEx {
	public static void main(String[] args) {
		HashSet<Human> datas = new HashSet<Human>();
		datas.add(new Human("홍길동", 24));
		datas.add(new Human("임꺽정", 33));
		datas.add(new Human("장길산", 45));
		datas.add(new Human("홍길동", 24));		
		
		Iterator<Human> itr = datas.iterator();
		while(itr.hasNext())
			System.out.println(itr.next());		
	}
}
package ex05.collections.set12;

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

/*
<HashSet/HashMap은 2단계가 같으면 같은 데이터로 판단>
1단계 : hashCode()값이 같은지
2단계 : equals()의 반환값이 같은지

Overriding해서 재정해서 비교한다
*/

class Human{
	private String name;
	private int age;
	
	Human(String name, int age){
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return name+":"+age;
	}
	
	//원래 jvm에 의해 해석되는 참조값을 리턴하게 되어있지만 
	//내용이 같은지 비교할 수 없어서 
	//내용을 반환하도록 오버라이딩 함.
	public int hashCode() {		//해쉬코드가 아닌 값을 비교하는 것으로 overriding.
		return this.toString().hashCode();
	}
	
	
	//원래 참조값이 같은지로 비교하게 되어있으나
	//내용 비교로 오버라이딩.
	public boolean equals(Object obj) {
		Human hu = (Human)obj;
		//return this.hashCode() == hu.hashCode();
		return this.name.equals(hu.name) && this.age == hu.age;
	}
	
	
	
	
	
}

public class HashSetEx {
	public static void main(String[] args) {
		HashSet<Human> datas = new HashSet<Human>();
		datas.add(new Human("홍길동", 24));
		datas.add(new Human("임꺽정", 33));
		datas.add(new Human("장길산", 45));
		datas.add(new Human("홍길동", 24));		
		
		Iterator<Human> itr = datas.iterator();
		while(itr.hasNext())
			System.out.println(itr.next());		
		
		Human hu = new Human("임꺽정",33);
		if(datas.contains(hu))		//hashcode와 equals 2단계 비교. 
			System.out.println("있다! "+ hu);
		
	}
}

0개의 댓글

관련 채용 정보