-
알기 쉬운 JAVA HashSet에 대해 알아보자프로그래밍/JAVA 2020. 5. 15. 14:04
HashSet
HashSet의 특징
1) java.util.Set 인터페이스를 구현한 컬렉션이다.
2) List 인터페이스와 반대되는 특징을 가지고 있다. (ex: Vector, ArrayList)
3) 데이터를 저장한 순서를 기억하지 않는다. (무작위로 저장)
4) 데이터 중복 저장을 허용하지 않는다.
5) 다양한 타입의 데이터들을 저장할 수 있다.
6) 기본형 데이터는 저장할 수 없다.
* HashSet이 자체적으로 중복을 체크하는 원리
HashSet은 객체를 저장하기 전에 객체의 hashCode()를 호출하여 해시코드를 얻어낸다.그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다. 만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
생성 방법
다른 자료구조와 마찬가지로 여러 데이터 타입을 저장할 수 있지만, 대체적으로 같은 자료 유형을 담기 위해 사용한다. 이 때 제네릭 <E>를 사용한다.
1) 먼저 HashSet을 사용하기 위해 java.util.* 을 import 해준다.
2) Vector<E>의 E에 요소로 사용할 타입을 지정한다.
String 유형의 HashSet을 만들기 위해서는 <String>으로 작성해준다.
Set<String> set = new HashSet<>();
자료유형은 부모클래스를 자료유형으로 하는 것이 의존성에서 더 효과적이다.
자료유형은 Set로 지정해준다.
하지만, 부모클래스인 Set은 인터페이스여서 객체를 생성할 수 없다.
따라서 객체 타입은 자식 객체인 HashSet()으로 지정해준다.
데이터 삽입
boolean add(E e) 제네렉 E타입의 e를 매개변수로 받는 add 메소드를 사용한다.
우리는 <E>를 <String>유형으로 해줬기 때문에 문자열을 넣어주자.
set.add() 메소드를 사용하여 HashSet에 담아준다.
set.add("Java"); set.add("JavaScript"); set.add("Vue.js");
HashSet의 특징 중 하나는 데이터를 무작위로 저장하는 것이다. 그래서 출력해보면 데이터를 삽입한 순으로 출력되지 않는다.
데이터 출력
HashSet은 다른 자료구조처럼 get() 메소드가 없다. 또한 순서가 있는 것이 아니기 때문에 Iterator를 통해 커서가 돌면서 데이터를 꺼내야 한다.
Iterator<String> it = set.iterator(); // Iterator 객체 생성 while(it.hasNext()) { // 반복문 돌면서 데이터 출력 String str = it.next(); System.out.println(str); }
중복된 데이터 처리
HashSet은 중복된 데이터를 삽입하면 출력할 때 자동으로 중복 데이터를 제외하고 보여준다.
Set<String> set = new HashSet<>(); set.add("Java"); set.add("JavaScript"); set.add("Vue.js"); set.add("Java"); // 넣어도 중복 안됨 System.out.println("총 객체 수: "+set.size());
위와 같이 set.add("Java") 메소드를 통해 데이터를 삽입했지만 이미 "Java"는 HashSet 구조에 담겨져 있다.
이 상태에서 데이터의 수를 알려주는 메소드 set.size()를 통해 데이터 수를 확인해보자.
총 객체 수: 3
우리가 넣은 데이터는 4개지만, 출력된 결과는 3이 나온다. 이유는 HashSet은 중복된 데이터를 알아서 처리해서 제외시키기 때문이다.
참고: 알기 쉬운 JAVA Eumeration과 Iterator에 대해 알아보자
'프로그래밍 > JAVA' 카테고리의 다른 글
JAVA - 배열 (array) (0) 2021.12.22 알기 쉬운 JAVA HashTable, HashMap에 대해 알아보자 (0) 2020.05.21 알기 쉬운 JAVA Enumeration과 Iterator 인터페이스에 대해 알아보자 (0) 2020.05.14 알기 쉬운 JAVA ArrayList에 대해 알아보자 (0) 2020.05.14 알기 쉬운 JAVA 벡터 클래스를 배열로 바꾸는 방법에 대해 알아보자 (0) 2020.05.13