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);
}
}