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과 동일하다.

+ Recent posts