[JAVA][컬렉션 프레임워크] 2. Set, Map
2021. 8. 16. 10:24
Set
- List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다.
- 객체 중복 저장이 안된다.
- null은 하나만 가능하다.
- Set의 특징은 수학의 집합과 비슷하다, 순서와 상관없고 중복이 허용되지 않기 때문이다.
- 기본적인 기능
Set<String> set = ...;
set.add("홍길동"); //추가
set.remove("홍길동"); // 삭제
Iterator<String> iterator = set.iterator(); // 반복자
while(iterator.hasNext()){ //저장된 객체 수 만큼 loop
//String 객체 하나 가져옴
String str = iterator.next();
}
for(String str : set){
//저장된 객체 수 만큼 loop
}
HashSet
Set<E> set = new HashSet<E>();
- 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다.
- HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어낸다.
- 그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다.
- 동일한 해시코드가 있다면 equals() 메소드로 두 객체를 비교하고 true면 중복저장하지 않는다.
- 예시
import java.util.*;
public class HashSetExample1{
public static void main(String[] args){
Set<String> set = new HashSet<String>();
set.add("JAVA");
set.add("JDBC");
set.add("Servelt/JSP");
set.add("JAVA"); // java는 한번만 저장됨
set.add("iBatis");
int size = set.size(); // 저장된 객체수 얻기 : 결과 4
Iterator<String> iterator = set.iterator(); // 반복자얻기
while(iterator.hasNext()){
String element = iterator.next();
System.out.println(element);
}
set.remove("JDBC");
set.remove("iBatis"); // 객체 삭제
set.clear(); // 모든 객체 비우기
}
}
서로 다른 인스턴스지만 이름과 나이가 같다면 중복처리하는 클래스 생성
Member클래스를 만들어 이름과 나이가 같으면 중복 객체로 간주하기 위한 hashcode(), equals() 재정의
public class Member{
public String name;
public int age;
public Member(String name, int age){
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj){
if(obj instanceof Member){
Member member = (Member) obj;
return member.name.equals(name) && (member.age == age);
}else{
return false;
}
}
@Override
public int hashCode(){
return name.hashCode() + age;
}
}
Map
- Map 컬렉션은 키와 값으로 구성된 Entry 객체를 저장하는 구조다
- 키와 값은 모두 객체이다.
- 키는 중복 불가, 값은 중복 가능하다
Map<String> map = ~;
map.put("홍길동", 30); //객체 추가
int score = map.get("홍길동"); //객체 찾기
map.remove("홍길동"); //객체 삭제
- 저장된 전체 객체를 대상으로 객체를 하나씩 얻고 싶은 경우
Map<K, V> map = ~;
Set<K> keySet = map.keySet();
Iterator<K> keyIterator = keySet.iterator();
while(keyIterator.hasNext()){
K key = keyIterator.next();
V value = map.get(key);
}
HashMap
- HashMap의 키로 사용할 객체는 hashCode()와 equlas()메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다.
- 동등객체가 될 조건은 hashCode()의 리턴값이 같아야하고 equlas()메소드가 true를 리턴해야한다.
- 주로 키 타입은 String을 많이 사용하는데, String은 무자열이 같은 경우 동득객체가 될수 있도록 hashCode()와 equlas() 메소드가 재정의되어있다.
Map<K, V> map = new HashMap<K, V>();
- 학번과 이름이 동일한 Student를 동등 키로 간주하기 위한 메소드 재정의
class Student(){
public int sno;
public String name;
public Student(int sno, String name){
this.sno = sno;
this.name = name;
}
public boolean equlas(Object obj){
if(ojb instanceof Student){
Student student = (Student) obj;
return (sno == student.sno) && (name.equals(student.name));
}else{
return false;
}
}
public int hashCode(){
return sno + name.hashCode();
}
}
Hashtable
- Hashtable은 HashMap과 동일한 내부 구조를 가지고 있다.
- Hashtable도 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다.
- HashMap과의 차이점은 Hashtable은 동기화된 메소드로 구성되어 있기 때문에 thread-safe 하다.
- 기본적인 호출 방법은 HashMap과 동일하다.
'skill > JAVA' 카테고리의 다른 글
[JAVA] stream은 얼마나 빠른가? (0) | 2023.03.06 |
---|---|
[Java] String, StringBuilder, StringBuffer 차이 (0) | 2021.08.23 |
[JAVA] 람다 함수형 인터페이스 1 (0) | 2021.08.12 |
[JAVA][컬렉션 프레임워크] 1. List (0) | 2021.08.10 |
[JAVA] JVM 실행순서, 메모리구조 (0) | 2021.05.17 |