공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
HashMap과 Hashtable
키(key) : 컬렉션 내에서 유일한 값 값(value) : 값의 중복을 허용 |
( Hashtable 은 HashMap 의 구버전이고 Hashtable 보다는 HashMap 을 사용하는 것을 권장한다.) HashMap 은 Map 을 구현한 것이므로 키(key)와 값(value)을 묶어서 하나로 저장한다는 특징을 갖는다. 그리고 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 성능이 뛰어나다. HashMap 은 키와 값이 각각 Object 타입으로 선언되어 있어 어떤 객체도 저장할 수 있지만 키는 주로 String 을 대문자 또는 소문자로 통일해서 사용한다. 키는 저장된 값을 찾는 데 사용되는 것이기 때문에 컬렉션 내에서 유일(unique) 해야 한다.
생성자 / 메서드 | 설 명 |
HashMap( ) | HashMap 객체를 생성 |
HashMap(int initialCapacity) | 지정된 값을 초기용량으로 하는 HashMap 생성 |
HashMap(int initialCapacity, float loadFactor) | 지정된 초기용량( initialCapacity)과 load factor의 HashMap 객체를 생성 |
HashMap(Map m) | 지정된 Map 의 모든 요소를 포함하는 HashMap 을 생성 |
void clear( ) | HashMap 에 저장된 모든 객체를 제거 |
Object clone( ) | 현재 HashMap 을 복제해서 반환 |
boolean containsKey(Object key) | HashMap 에 지정된 키( key )가 포함되어 있는지 알려준다 포함되어 있으면 true |
boolean containsValue(Object value) | HashMap 에 지정된 값( value )이 포함되어 있는지 알려준다. 포함되어 있으면 true |
Set entrySet( ) | HashMap 에 저장된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set 에 저장해서 반환 |
Object get(Object key) | 지정된 키( key )의 값(객체)을 반환. 못찾으면 null 반환 |
Object getOrDefault(Object key, Object defaultValue) | 지정된 키( key )의 값(객체)을 반환한다. 키를 못찾으면, 기본값( defaultValue )으로 지정된 객체를 반환 |
booelan isEmpty( ) | HashMap 이 비어있는지 알려줌 |
Set keySet( ) | HashMap 에 저장된 모든 키가 저장된 Set 을 반환 |
Object put(Object key, Object value) | 지정된 키와 값을 HashMap 에 저장 |
void putAll(Map m) | Map 에 저장된 모든 요소를 HashMap 에 저장 |
Object remove(Object key) | HashMap 에서 지정된 키로 저장된 값(객체)을 제거 |
Object replace(Object key, Object value) | 지정된 키의 값을 지정된 객체( value )로 대체 |
boolean replace(Object key, Object oldValue, Object newValue) | 지정된 키와 객체( oldValue )가 모두 일치하는 경우에만 새로운 객체( newValue )로 대체 |
int size( ) | HashMap 에 저장된 요소의 개수 반환 |
Collection values( ) | HashMap 에 저장된 모든 값을 컬렉션의 형태로 반환 |
package Example;
import java.util.*;
public class Example {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("myId", "1234");
map.put("asdf", "1111");
map.put("asdf", "1234");
Scanner s = new Scanner(System.in); //화면으로부터 라인단위로 입력받는다.
while(true) {
System.out.println("id와 password를 입력해주세요 ");
System.out.print("id : ");
String id = s.nextLine().trim();
System.out.print("password : ");
String password = s.nextLine().trim();
System.out.println();
if(!map.containsKey(id)) {
System.out.println("입력하신 id는 존재하지 않습니다." + " 다시 입력해주세요");
continue;
} else {
if(!(map.get(id).equals(password))) {
System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요");
}else {
System.out.println("id와 비밀번호가 일치합니다");
break;
}
}
}
}
}
HashMap 의 특징을 확인하는 예제이다. 실행결과를 보면 아이디 asdf 의 비밀번호가 1234 로 바뀐 것을 확인할 수 있다.
중복된 key값이 들어오면 새로 추가되지 않고 기존의 값을 덮어쓴다. 키인 asdf 가 이미 존재하기 때문에 기존의 값이 덮어 씌워진 것을 확인할 수 있다. Map 의 값은 중복을 허용하지만 키는 중복을 허용하지 않기 때문에 저장하려는 두 데이터 중에서 어느 쪽을 키로 할 것인지를 잘 결정해야 한다.
package Example;
import java.util.*;
public class Example {
static HashMap phoneBook = new HashMap();
public static void main(String[] args) {
addPhoneNo("친구", "이자바", "010-111-1111");
addPhoneNo("친구", "김자바", "010-222-2222");
addPhoneNo("친구", "김자바", "010-333-3333");
addPhoneNo("회사", "김대리", "010-444-4444");
addPhoneNo("회사", "김대리", "010-555-5555");
addPhoneNo("회사", "박대리", "010-666-6666");
addPhoneNo("회사", "이과장", "010-777-7777");
addPhoneNo("세탁", "010-888-8888");
printList();
}
//그룹에 전화번호 추가
static void addPhoneNo(String groupName, String name, String tel) {
addGroup(groupName);
HashMap group = (HashMap)phoneBook.get(groupName);
group.put(tel, name); //이름은 중복될 수 있어서 전화번호를 key로 저장
}
static void addPhoneNo(String name, String tel) {
addPhoneNo("기타", name, tel); //그룹입력 안할경우 "기타"그룹으로 기본설정
}
//그룹추가
static void addGroup(String groupName) {
if(!phoneBook.containsKey(groupName))
phoneBook.put(groupName, new HashMap());
}
//전화번호 전체출력
static void printList() {
Set set = phoneBook.entrySet();
Iterator it = set.iterator();
while(it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
/*
HashMap은 데이터(키와 값)를 Object타입으로 저장하기 때문에 HashMap의 값(value)으로 HashMap을 다시 저장할 수 있다.
-> 하나의 키에 다시 복수의 데이터를 저장할 수있다.
*/
Set subSet = ((HashMap)e.getValue()).entrySet();
Iterator subIt = subSet.iterator();
System.out.println(" * " + e.getKey() + " [" + subSet.size() + "] ");
while(subIt.hasNext()) {
Map.Entry subE = (Map.Entry)subIt.next();
String telNo = (String)subE.getKey();
String name = (String)subE.getValue();
System.out.println(name + " " + telNo);
}
System.out.println();
}
}
}
HashMap 은 데이터(키와 값)를 Object 타입으로 저장하기 때문에 HashMap 의 값(value)으로 HashMap 을 다시 저장할 수 있다. 이렇게 하면 하나의 키에 다시 복수의 데이터를 저장할 수 있다.
TreeMap
TreeMap 은 이진 검색 트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다. 검색과 정렬에 적합한 컬렉션 클래스이다. HashMap 과 TreeMap 의 검색 성능에 관한 것인데, 검색에 관한 대부분의 경우에서 HashMap 이 TreeMap 보다 더 뛰어나므로 HashMap 을 사용하는 것이 좋다. 다만 범위 검색이나 정렬이 필요한 경우에는 TreeMap 을 사용하는 것이 좋다.
메 서 드 | 설 명 |
TreeMap( ) | TreeMap 객체생성 |
TreeMap(Comparator c) | 지정된 Comparator 를 기준으로 정렬하는 TreeMap 객체를 생성 |
TreeMap(Map m) | 주어진 Map 에 저장된 모든 요소를 포함하는 TreeMap 생성 |
TreeMap(SortedMap m) | 주어진 SortedMap 에 저장된 모든 요소를 포함하는 TreeMap 생성 |
Map.Entry ceilingEntry(Object key) | 지정된 key 와 일치하거나 큰 것중 제일 작은 것의 키와 값의 쌍( Map.Entry )을 반환. 없으면 null 반환 |
Object ceilingKey(Object key) | 지정된 key 와 일치하거나 큰 것중 제일 작은 것의 키를 반환, 없으면 null 반환 |
void clear( ) | TreeMap 에 저장된 모든 객체를 제거 |
Object clone( ) | 현재 TreeMap 을 복제해서 반환 |
Comparator comparator( ) | TreeMap 의 정렬기준이 되는 Comparator 를 반환 Comparator가 지정되지 않았다면 null을 반환 |
boolean containsKey(Object key) | TreeMap 에 지정된 키( key )가 포함되어있는지 알려줌 포함되어 있으면 true |
boolean containsValue(Object value) | TreeMap 에 지정된 값( value )이 포함되어 있는지 알려줌 포함되어 있으면 true |
NavigableSet descendingKeySet( ) | TreeMap 에 저장된 키를 역순으로 정렬해서 NavigableSet 에 담아서 반환 |
Set entrySet( ) | TreeMap 에 저장된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set 에 저장해서 반환 |
Map.Entry firstEntry( ) | TreeMap 에 저장된 첫 번째(가장 작은) 키와 값의 쌍( Map.Entry )을 반환 |
Object firstKey( ) | TreeMap 에 저장된 첫 번째(가장 작은) 키를 반환 |
Map.Entry floorEntry(Object key) | 지정된 key 와 일치하거나 작은 것 중에서 제일 큰 키의 쌍( Map.Entry )을 반환. 없으면 null 반환 |
Object floorKey(Object key) | 지정된 key 와 일치하거나 작은 것 중에서 제일 큰 키를 반환. 없으면 null 반환 |
Object get(Object key) | 지정된 키( key )의 값(객체)을 반환 |
SortedMap headMap(Object toKey) | TreeMap 에 저장된 첫 번째 요소부터 지정된 범위에 속한 모든 요소가 담긴 SortedMap 을 반환(toKey는 미포함) |
NavigableMap headMap(Object toKey, boolean inclusive) | TreeMap 에 저장된 첫 번째 요소부터 지정된 범위에 속한 모든 요소가 담긴 SortedMap 을 반환. inclusive의 값이 true면 toKey도 포함 |
Map.Entry higherEntry(Object key) | 지정된 Key 보다 큰 키 중에서 제일 작은 키의 쌍( Map.Entry )을 반환. 없으면 null 반환 |
Object higherKey(Object key) | 지정된 Key 보다 큰 키 중에서 제일 작은 키를 반환. 없으면 null을 반환 |
boolean isEmpty( ) | TreeMap 이 비어있는지 알려줌 |
Set keySet( ) | TreeMap 에 저장된 모든 키가 저장된 Set을 반환 |
Map.Entry lastEntry( ) | TreeMap 에 저장된 마지막 키(가장 큰 키)의 쌍을 반환 |
Object lastEntry( ) | TreeMap 에 저장된 마지막 키(가장 큰 키)를 반환 |
Map.Entry lowerEntry(Object key) | 지정된 key 보다 작은 키 중에서 제일 큰 키의 쌍( Map.Entry )을 반환. 없으면 null 반환 |
Object lowerKey(Object key) | 지정된 key 보다 작은 키 중에서 제일 큰 키를 반환, 없으면 null을 반환 |
NavigableSet navigableKeySet( ) | TreeMap 의 모든 키가 담긴 NavigableSet 을 반환 |
Map.Entry pollFirstEntry( ) | TreeMap 에서 제일 작은 키를 제거하면서 반환 |
Map.Entry pollLastEntry( ) | TreeMap 에서 제일 큰 키를 제거하면서 반환 |
Object put(Object key, Object value) | 지정된 키와 값을 TreeMap 에 저장 |
void putAll(Map map) | Map 에 저장된 모든 요소를 TreeMap 에 저장 |
Object remove(Object key) | TreeMap 에서 지정된 키로 저장된 값(객체)을 제거 |
Object replace(Object k, Object v) | 기존의 키( k )의 값을 지정된 값( v )으로 변경 |
boolean replace(Object key, Object oldValue, Object newValue) | 기존의 키( key )값을 새로운 값( newValue )으로 변경 단, 기존의 값과 지정된 값( oldValue )가 일치해야함 |
int size( ) | TreeMap 에 저장된 요소의 개수 반환 |
NavigableMap subMap(Object fromKey, boolean fromInclusive, Object toKey, boolean toInclusive) | 지정된 두 개의 키 사이에 있는 모든 요소들이 담긴 NavigableMap 을 반환. fromInclusive가 true면 범위에 fromKey포함. toInclusive가 true면 범위에 toKey포함 |
SortedMap subMap(Object fromKey, Object toKey) | 지정된 두 개의 키 사이에 있는 모든 요소들이 담긴 SortedMap 을 반환(toKey는 포함되지 않는다.) |
SortedMap tailMap(Object fromKey) | 지정된 키부터 마지막 요소의 범위에 속한 요소가 담긴 SortedMap 을 반환 |
NavigableMap tailMap(Object fromKey, boolean inclusive) | 지정된 키부터 마지막 요소의 범위에 속한 요소가 담긴 NavigableMap 을 반환. inclusive가 true면 fromKey포함 |
Collection values( ) | TreeMap 에 저장된 모든 값을 컬렉션의 형태로 반환 |
'Back end > Java' 카테고리의 다른 글
[Java] Properties, Collections (0) | 2019.07.26 |
---|---|
[Java] 해싱(hashing)과 해시함수(hash function) (0) | 2019.07.25 |
[Java] HashSet, TreeSet (0) | 2019.07.24 |
[Java] Iterator, Arrays, Comparator (0) | 2019.07.23 |
[Java] 스택(Stack)과 큐(Queue) (1) | 2019.07.22 |