버글버글
Java 수업 기록 (18) Collection Framework - Hash 본문
반응형
▶ Hash
1. 다양한 길이를 가진 데이터를 고정된 길이를 가지는 데이터로 매핑(Mappint)한 값
2. 어떤 데이터를 저장할 때 해당 데이터의 해시값을 계산해서 인덱스(Index)로 사용함
3. 어떤 데이터를 검색할 때 해당 데이터의 해시값을 인덱스(Index)로 사용하면 되기 때문에 빠른 조회가 가능
* 동일한 해쉬값을 가진 코드를 찾아서 비교를 한다. (= 동등 비교)
* Hash 비교를 하는 이유는 빠른 비교를 하기 때문이다
( ex : 아이디가 a로 시작하는 해쉬코드는 1번, b로 시작하는 해쉬코드는 2번 .... .... ...)
* Java의 HashCode는 객체의 참조값 이다.
* Hash set은 동일한 데이터가 들어갈 수 없다.
* 비밀번호 특징이라고 생각하면 된다.
비밀번호 | 해쉬 코드 | |
A | → | 1234 |
? | ← | 1234 |
'A'의 해쉬 코드는 '1234'가 맞다. 하지만 '1234'의 해쉬 코드가 'A'인건 알수없다. |
* 만약 동일 객체가 입력(?) 될 시
- hash code비교, hash code가 동일 할 시에 equals(문자열이 같은지)로 비교 한다.
Book book1 = new Book(1, "어린왕자");
Book book2 = new Book(2, "홍길동전");
Book book3 = new Book(3, "소나기");
Book book4 = new Book(3, "소나기");
Set<Book> books = new HashSet<Book>();
books.add(book1);
books.add(book2);
books.add(book3);
books.add(book4);
// 중복 저장 시도(정상 동작하려면 Book 클래스에 hashCode(), equals() 메소드를 Override를 해야 함)
for(Book book : books) {
System.out.println(book);
// 1, 어린왕자
// 2, 홍길동전
// 3, 소나기
// 3, 소나기
* Book 클래스를 아래와 같이 hashcode() , equals() 메소드를 override 해야 한다.
package ex03_hash;
public class Book {
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + bookNo;
result = prime * result + ((title == null) ? 0 : title.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (bookNo != other.bookNo)
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
return true;
}
}
예제) 몇 번만에 가위 바위 보를 HashSet에 모두 넣을 수 있는지 확인한다.
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
String[] rsp = {"가위", "바위", "보"};
// rsp 배열에서 임의의 값 하나를
// rsp[0] == "가위";
// rsp[1] == "바위";
// rsp[2] == "보";
Set<String> set = new HashSet<String>();
int cnt = 0;
while(set.size() < 3) {
int i = (int)(Math.random() * 3); // 0, 1, 2 중 하나
set.add(rsp[i]);
cnt++;
}
System.out.println(set);
System.out.println(cnt);
}
반응형
'java > java 수업 기록' 카테고리의 다른 글
Java 수업 기록 (20) Collection Framework - Iterator, Collections (0) | 2022.08.12 |
---|---|
Java 수업 기록 (19) Collection Framework - maping, treemap (0) | 2022.08.11 |
Java 수업 기록 (17) Collection Framework - Set (0) | 2022.08.09 |
Java 수업 기록 (16) Collection Framework - ArrayList (0) | 2022.08.08 |
Java 수업 기록 (15) Exception (0) | 2022.08.07 |