본문 바로가기

개발/Java

[Java] 자바 - 컬렉션 - HashSet

 

< HashSet >

 

- Set계열 : 담고자 하는 값(Value)만 저장 / 저장시 순서 없음 / 중복값 허용하지 않음

- 사용법은 List계열과 비슷

[ 표현법 ] Hashset 객체 이름 = new HashSet();

 

> 생성

HashSet<String> hs = new HashSet(); // 제네릭 설정

> 값 추가 - add(추가할 값)

hs.add("안녕하세요!");
hs.add("여러분");
// 순서 보장되지 않음

> 크기 확인 - size()

System.out.println("hs의 크기 : " + hs.size());

> 값 삭제 - remove(삭제할 값)

hs.remove("여러분");

> 비우기 - clear() : 모든 값을 삭제해주는 메소드

hs.clear();

 

[ 중복값 거르는 법 ]

- HashSet에 객체를 담을 때, 내부적으로 equals()*와 hashCode()*로 비교 후

  둘 다 결과가 true일 경우 동일 객체로 인식하여 중복된 값을 거름

- 중복저장 오류를 방지하기 위해 equals와 hashCode메소드를 오버라이딩 해서 사용

 

* equals() : 두 객체의 주소값을 비교해서 일치하면 true, 불일치하면 false 반환. Object클래스의 메소드

* hashCode() : 객체의 주소값을 해싱해서 10진수 형태로 반환. Object클래스의 메소드

 

[ 값 출력 ]

1. 반복문 사용 - 인덱스 개념이 없기 때문에 향상된 for문 사용

// 내가 만든 Student객체가 담긴 HashSet stds
for(Student s :stds) { 
    System.out.println(s);
}

2. ArrayList 사용 - HashSet의 값을 ArrayList에 담아, 인덱스를 이용하여 출력

// 1단계) ArrayList 생성
ArrayList list = new ArrayList();
// 2단계) addAll메소드 사용하여 값 넣기
list.addAll(stds);

// 1단계 + 2단계
ArrayList<Student> students = new ArrayList(stds); // 생성자 안에 넣어서 처리

// for문으로 출력 - ArrayList 인덱스 사용 가능
for(int i = 0; i <list.size(); i++) { // 반복문 size()사용
    System.out.println(list.get(i));
}

3. Iterator(반복자) 사용 - iterator() : HastSet을 Iterator타입으로 변환해주는 메소드

Iterator it = stds.iterator();

while(it.hasNext()) { // hasNext() : 더 빼올 값이 남아있으면 true, 없으면 false를 반환해주는 메소드
    System.out.println(it.next()); // next() : 다음에 오는 값을 반환해주는 메소드
}