자바 step12 - UtilClass(HashMap, Map, HashSet 객체) - 5
HashMap
package test.main;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class MainClass09 {
public static void main(String[] args) {
HashMap<String, String> dic=new HashMap<>();
dic.put("house", "집");
dic.put("phone", "전화기");
dic.put("car", "자동차");
dic.put("pencil", "연필");
dic.put("eraser", "지우개");
/*
* 검색할 단어를 입렵하세요: house
* house 의 뜻은 집입니다.
*
* 검색할 단어를 입력하세요: gura
* gura 는 목록에 없습니다.
*/
Scanner scan=new Scanner(System.in);
System.out.print("검색할 단어를 입력하세요:");
String line=scan.nextLine();
// 만일 HashMap 객체가 입력한 line 을 key 값으로 가지고 있다면
if(dic.containsKey(line)) {
System.out.println(line+"의 뜻은 "+dic.get(line)+"입니다.");
} else {
System.out.println(line+"은(는) 목록에 없습니다.");
}
}
}
<console>
검색할 단어를 입력하세요:house
house의 뜻은 집입니다.
검색할 단어를 입력하세요:gura
gura은(는) 목록에 없습니다.
HashMap 객체는 <> 안에 key, value 형식으로 들어가기 때문에 무슨 타입이 들어가는지 선언해 주어야 한다.
new HashMap<> 안은 생략 가능하다.
put() 메소드로 key, value 값을 넣을 수 있고, key값으로 value값을 호출할 수 있다.
if 문 안에 조건으로 containsKey() 메소드가 적혀있는데 이 함수는 맵에서 키 값이 있는지 확인하는 함수이다.
벨류값이 있는지 확인하는 함수로 containsValue도 있다 True, False 로 반환한다.
get() 메소드로 key값의 value값을 가져올 수 있다.
Map
package test.main;
import java.util.HashMap;
import java.util.Map;
public class MainClass10 {
public static void main(String[] args) {
/*
* 회원정보는 숫자(int), 문자(String) 으로 구성 되어 있기 때문에
* value 의 generic 은 Object 로 지정해야 한다.
*/
Map<String, Object> map=new HashMap<>();
// value 의 generic 이 Object 이기 때문에 어떤 type 이든지 담을 수 있다.
map.put("num", 1);
map.put("name", "김구라");
map.put("addr", "노량진");
// Object type 으로 리턴되기 때문에 원래 type 으로 casting 해주어야 한다.
int num=(int)map.get("num");
String name=(String)map.get("name");
String addr=(String)map.get("addr");
}
}
<console>
HashMap은 Map을 인터페이스를 통해 구현한 구현체로 위와 같은 형태의 객체 생성 가능하다.위의 예문을 보면 Map 객체에 저장할 타입으로서 int와 String 타입이 존재하므로 <>안에는 String(변수명 타입), Object(저장할 값의 타입) 이 들어간다.마찮가지로 put()메소드를 활용해 값을 저장하고 있다.값을 호출하여 그 값을 다시 변수명에 넣어야 할 경우에는 Object 타입으로 저장되었기 때문에 다시 원래의 타입으로 casting 해 주어야 한다.
HashSet
package test.main;
import java.util.HashSet;
import java.util.Set;
/*
* HashSet 은 Set 인터페이스를 구현한 클래스이다.
*
* - 순서가 없다.
* - key 값도 없다.
* - 중복을 허용하지 않는다.
* - 어떤 data 를 묶음(집합) 으로 관리하고자 할 때 사용한다.
*/
public class MainClass11 {
public static void main(String[] args) {
Set<Integer> set1=new HashSet<>();
set1.add(10);
set1.add(20);
set1.add(20);
set1.add(30);
set1.add(30);
// 문자열을 저장할 수 있는 HashSet 객체
Set<String> set2=new HashSet<>();
set2.add("kim");
set2.add("lee");
set2.add("park");
set2.add("lee");
set2.add("park");
System.out.println(set1);
System.out.println(set2);
}
}
<console>
[20, 10, 30]
[lee, kim, park]
HashSet 은 Set 인터페이스를 구현한 클래스이다. - 순서가 없다.
- key 값도 없다.
- 중복을 허용하지 않는다.
- 어떤 data 를 묶음(집합) 으로 관리하고자 할 때 사용한다.
HashMap과 HashSet의 차이점은 크게 아래 6가지로 나눌 수 있다.
1. 정의
HashMap은 Map 인터페이스의 구현체로, HashTable과 유사한 자료구조로 데이터를 저장한다.
HashSet은 Set 인터페이스의 구현체로, 내부적으로 HashMap을 사용하기 때문에 HashTable과 유사한 자료구조로 데이터를 저장한다.
2. 데이터 저장 형태
HashMap은 Key-Value 쌍 형태로 데이터를 저장하며, Key와 Value의 mapping을 유지하고 있다.
HashSet은 객체 그 자체를 저장한다.
위에서 HashMap을 내부적으로 사용한다고 했는데,
Key 값으로는 삽입되는 객체 그 자체를, Value 값으로는 HashSet 내부 구현 코드에서 미리 선언해둔 dummy 객체를 사용한다.
3. 중복 허용 여부
HashMap은 중복 Key 값을 허용하지 않지만, 중복 Value 값은 허용한다.
ex. {'a': 1, 'b': 1, 'c': 2}
HashSet은 객체 자체를 데이터로 저장하기 때문에 중복을 허용하지 않는다.
ex. {'a', 'b', 'c'}
4. NULL 허용 여부
HashMap은 (중복 Key 값을 허용하지 않기 때문에) 단 하나의 NULL 값을 Key 값으로 가질 수 있고, 여러 NULL 값을 Value 값으로 가질 수 있다.
HashSet은 단 하나의 NULL 값을 가질 수 있다.
5. 데이터 삽입 방법
HashMap은 put() 메서드를 사용하여 데이터를 삽입하는데, Key-Value 쌍 데이터의 형태를 저장하기 때문에
삽입 연산 동안 단 하나의 객체가 생성된다.
HashSet은 add() 메서드를 사용하여 데이터를 삽입하는데,
객체 그 자체를 저장하고 내부적으로 HashMap을 사용하기 때문에 삽입되는 객체(Key값)와 dummy 객체(Value 값),
총 두 개의 객체가 삽입 연산 동안 생성된다.
성능
HashMap이 HashSet보다 빠르다.
그래서 데이터의 유일함(Uniqueness)을 유지하기 위해 항상 HashMap이 HashSet보다 선호된다.
HashMap과 HashSet의 차이점 출처 : https://siahn95.tistory.com/entry/Java%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-HashMap-HashSet-%EC%9D%B4%EB%9E%80-5-HashMap-vs-HashSet#--%--%EB%-D%B-%EC%-D%B-%ED%--%B-%--%EC%--%BD%EC%-E%--%--%EB%B-%A-%EB%B-%--