Map 컬렉션
Map 컬렉션은 키와 값으로 구성된 엔트리 객체를 저장한다. 여기서 키와 값은 모두 객체이다. 키는 중복 저장할 수 없지만 값은 중복 저장할 수 있다. 기존에 저장된 키와 동일한 키로 값을 지정하면 기존 값은 없어지고 새로운 값으로 대체된다.
| 기능 | 메서드 | 설명 |
| 객체 추가 | V put(K key, V value) | 주어진 키와 값을 추가, 저장이 되면 리턴 |
| 객체 검색 | boolean containsKey(Object key) | 주어진 키가 있는지 여부 |
| boolean containsValue(Object value) | 주어진 값이 있는지 여부 | |
| Set<Map.Entry<K, V>> entrySet() | 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴 | |
| V get(Object key) | 주어진 키의 값을 리턴 | |
| boolean isEmpty() | 컬렉션이 비어있는지 여부 | |
| Set<K> keySet() | 모든 키를 Set 객체에 담아서 리턴 | |
| int size() | 저장된 키의 총 수를 리턴 | |
| Collection<V> values() | 저장된 모든 값 Collection에 담아서 리턴 | |
| 객체 삭제 | void clear() | 모든 Map.Entry(키와 값)를 삭제 |
| V remove(Object key) | 주어진 키와 일치하는 Map.Entry 삭제, 삭제가 되면 값을 리턴 |
HashMap
HashMap은 키로 사용할 객체가 hashCode() 메서드의 리턴값이 같고 equals() 메서드가 true를 리턴할 경우, 동일 키로 보고 중복 저장을 허용하지 않는다.
Map<K, V> map = new HashMap<K, V>();
Map<String, Integer> map = new HashMap<String, Integer>();
Map<String, Integer> map = new HashMap<>();
Map map = new HashMap(); // 가능은 하되 거의 사용하지 않음
예제 코드
package ch15;
import java.util.*;
import java.util.Map.Entry;
public class HashMapExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, Integer> map = new HashMap<>();
map.put("신용권", 85);
map.put("홍길동", 90);
map.put("동장군", 80);
map.put("홍길동", 95);
System.out.println("총 Entry 수 : " + map.size());
System.out.println();
String key = "홍길동";
int value = map.get(key);
System.out.println(key + ": " + value);
System.out.println();
Set<String> keySet =map.keySet();
Iterator<String> keyIterator = keySet.iterator();
while(keyIterator.hasNext()) {
String k = keyIterator.next();
Integer v = map.get(k);
System.out.println(k + " : " + v);
}
System.out.println();
Set<Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Entry<String, Integer>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()) {
Entry<String, Integer> entry = entryIterator.next();
String k = entry.getKey();
Integer v = entry.getValue();
System.out.println(k + " : " + v);
}
System.out.println();
map.remove("홍길동");
System.out.println("총 Entry 수: " + map.size());
System.out.println();
}
}
출력 결과
총 Entry 수 : 3
홍길동: 95
홍길동 : 95
신용권 : 85
동장군 : 80
홍길동 : 95
신용권 : 85
동장군 : 80
총 Entry 수: 2
Hashtable
Hashtable은 HashMap과 동일한 내부 구조를 가지고 있다. 차이점은 Hashtable은 동기화된 메서드로 구성되어 있기 때문에 멀티 스레드가 동시에 Hashtable의 메서드들을 실행할 수 없다는 것이다. 따라서 멀티 스레드 환경에서도 안전하게 객체를 추가, 삭제할 수 있다.
Map<String, Integer> map = new Hashtable<String, Integer>();
Map<String, Integer> map = new Hashtable<>();
다음은 ThreadA와 ThreadB에서 동시에 각각 1000개씩 엔트리를 Hashtable에 추가한 후, 전체 저장된 수를 출력하는 예제이다.
package ch15;
import java.util.Hashtable;
import java.util.Map;
public class HashtableExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, Integer> map = new Hashtable<>();
Thread threadA = new Thread() {
@Override
public void run() {
for(int i = 1; i<=1000; i++) {
map.put(String.valueOf(i), i);
}
}
};
Thread threadB = new Thread() {
@Override
public void run() {
for(int i = 1001; i<=2000; i++) {
map.put(String.valueOf(i), i);
}
}
};
threadA.start();
threadB.start();
try {
threadA.join();
threadB.join();
} catch(Exception e) {
}
int size = map.size();
System.out.println("총 엔트리 수: " + size);
}
}
출력 결과
총 엔트리 수: 2000
Properties
Properties는 Hashtable의 자식 클래스이기 때문에 Hashtable의 특징을 그대로 가지고 있다. Properties는 키와 값을 String 타입으로 제한한 컬렉션이다. Properties는 주로 확장자가 .properties인 프로퍼티 파일을 읽을 때 사용한다. 프로퍼티 파일을 다음과 같이 키와 값이 = 기호로 연결되어 있는 텍스트 파일이다. 일반 텍스트 파일과 다르게 ISO 8859-1 문자셋으로 저장되며, 한글일 경우에는 \u+유니코드로 표현되어 저장된다.
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger
admin=\uD64D\uAE38\uB3D9
Properties을 사용하면 위와 같은 프로퍼티 파일의 내용을 코드에서 쉽게 읽을 수 있다. 먼저 Properties 객체를 생성하고, load() 메서드로 프로퍼티 파일의 내용을 로드한다.
Properties properties = new Properties();
properties.load(Xxx.class.getResourceAsStream("database.properties"));
예제 코드
package ch15;
import java.util.Properties;
public class PropertiesExample {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Properties properties = new Properties();
properties.load(PropertiesExample.class.getResourceAsStream("database.properties"));
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
String admin = properties.getProperty("admin");
System.out.println("driver: " + driver);
System.out.println("url: " + url);
System.out.println("username: " + username);
System.out.println("password: " + password);
System.out.println("admin: " + admin);
}
}
database.properties 파일을 해당 폴더에 복사한 후 실행하면 값이 나오게 된다.
'Language > JAVA' 카테고리의 다른 글
| [JAVA] LIFO와 FIFO 컬렉션 (1) | 2024.10.18 |
|---|---|
| [JAVA] 검색 기능을 강화시킨 컬렉션 (0) | 2024.10.18 |
| [JAVA] Set 컬렉션 (0) | 2024.10.18 |
| [JAVA] List 컬렉션 (0) | 2024.10.17 |
| [JAVA] 데몬 스레드와 스레드풀 (3) | 2024.10.17 |