List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다.
또한 객체를 중복해서 저장할 수 없고 ,
하나의 null만 저장할 수 있다.
Set 컬렉션은 수학의 집합에 비유 될 수 있다.
집한은 순서와 상관없고 중복이 허용되지않기 때문이다.
들어갈(저장할) 때의 순서와 나올(찾을) 때의 순서가 다를수도 있다
Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있다.
아래는 Set 컬렉션에서 공통으로 사용가능한 Set 인터페이스 메소드이다.
인덱스로 관리하지 않기 때문에 인덱스 매개값을 가지는 메소드는 없다.
기능 | 메소드 | 설명 |
객체추가 | boolean add(E e) | 주어진 객체를 저장, 객체가 성공적으로 저장되면 true를 리턴하고 중복 객체면 false를 리턴 |
객체검색 | boolean contaions(Object o) | 주어진 객체가 저장되어 있는지 여부 |
boolean isEmpty() | 컬렉션이 비어 있는지 | |
Itertor<E> iterator | 저장된 객체를 한 번씩 가져오는 반복자 리턴 | |
int size() | 저장되어 있는 전체 객체 수 리턴 | |
객체삭제 | void clear() | 저장된 모든 객체를 삭제 |
boolean remove(Object o) | 주어진 객체를 삭제 |
메소드의 매개 변수 타입과 리턴 타입에 E라는 타입 파라미터가 있는데,
Set 인터페이스가 제네릭 타입 이기 때문이다, 구체적인 타입은 구현 객체를 생성할 때 결정된다.
객체 추가는 add() 메소드를 사용, 삭제는 remove() 메소드를 사용한다
다음은 Set 컬렉션 String 타입 저장, 삭제 예제 이다.
Set<String> set = ...;
set.add("홍길동");// 객체 추가
set.remove("홍길동");// 객체 삭제
Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없다.
전체 객체를 대상으로 한번씩 반복해서 가져오는 Iterator(반복자)를 제공한다
반복자는 Iterator 인터페이스를 구현한 객체를 말하는데, iterator() 메소드를 호출하면 얻을 수 있다.
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
리턴 타입 | 메소드명 | 설명 |
boolean | hasNext() | 가져올 객체가 있으면 true를 리턴하고, 없으면 false를 리턴한다. |
E | next() | 컬렉션에서 하나의 객체를 가져온다 |
void | remove() | Set 컬렉션에서 객체를 제거한다. |
Iterator 에서 하나의 객체를 가져올 때는 next() 메소드를 사용한다.
next() 메소드를 사용하기 전에 먼저 가져올 가져올 객체가 있는지 hasNext() 메소드를 통해 true 가 리턴되는지 확인한다.
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
//String 객체 하나를 가져옴
String str = iterator.next(); // 저장된 객체수만큼 루핑
}
Iterator 대신 향상된 for을 사용해도 전체 객체를 대상으로 반복할 수 있다.
Set<String> set = ...;
for(String str : set){}
Set 컬렉션에서 Iterator 의 next() 메소드로 가져온 객체를 제거하고 싶다면 remove() 메소드를 호출하면 된다.
Iterator 의 메소드이지만, 실제 Set 컬렉션 에서 객체가 제거됨을 알아야 한다.
다음은 Set 컬렉션에서 "홍길동"을 제거한다.
While(iterator.hasNext()){
String str = iterator.next();
if(str.equals("홍길동")){
iterator.remove();
}
}
HashSet
HashSet 은 Set 인터페이스의 구현 클래스이다.
HashSet을 생성하기 위해서는 다음과 같이 기본 생성자를 호출하면 된다.
Set<E> set = new HashSet<E>();
타입 파라미터 E 에는 컬렉션에 저장할 객체 타입을 지정하면 된다.
String 객체를 저장하는 HashSet은 아래와 같다
Set<String> set = new HashSet<String>();
Hashset 객체들은 순서 없이 저장하고 , 동일한 객체는 중복 저장하지 않는다.
*HashSet에서 동일한 객체란 같은 인스턴스를 뜻하지 않는다.
객체를 저장하기 전 hashCode() 메소드를 호출해 해시코드를 얻은뒤
이미 저장된 객체들 해시 코드와 비교한다
만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면
동일한 객체로 판단하고 중복 저장하지 않는다.
문자열 HashSet에 저장 할 경우,
같은 문자열을 갖는 String 객체는 동등한 객체로 간주되고
다른 문자열을 갖는 String 객체로 간주 되는데
그 이유는 String 클래스가 hashCode() 와 equals() 메소드를 재정의해서
같은 문자열 일 경우 hashCode() 의 리턴값을 같게 equals()의 리턴값은 true 가 나오도록 했기 때문이다.
package CollectionFrameWork;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetExample1 {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("A");
set.add("B");
set.add("C");
set.add("D");
set.add("A");
int size = set.size();
System.out.println("Size of HashSet is: " + size);
Iterator<String> itr = set.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
set.remove("A");
System.out.println("After removing A");
System.out.println(set.size());
itr = set.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
set.clear();
System.out.println("After clearing");
System.out.println(set.size());
}
}
package CollectionFrameWork;
import java.util.Objects;
public class Member {
private String name;
private int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Member)) return false;
Member member = (Member) o;
return age == member.age && Objects.equals(name, member.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
package CollectionFrameWork;
import java.util.HashSet;
import java.util.Set;
public class HashSetExample2 {
public static void main(String[] args) {
Set<Member> set = new HashSet<>();
set.add(new Member( "John",1));
set.add(new Member( "John",1));
set.add(new Member( "John3",2));
System.out.println(set.size());
}
}
'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글
검색 기능을 강화 시킨 컬렉션 (0) | 2022.05.15 |
---|---|
Map 컬렉션 (0) | 2022.05.15 |
List 컬렉션 (0) | 2022.04.24 |
컬렉션 프레임 워크 (0) | 2022.04.24 |
람다식 표준 API의 함수적 인터페이스, 메소드 참조 (0) | 2022.04.10 |