List 컬랙션은 저장 순서를 유지하지만, Set 컬랙션은 저장 순서가 유지되지 않는다.
또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다. 수학의 집합에 비유 집합은 순서와 상관없고 중복이 허용되지 않기 때문.
들어갈 때의 순서가 다를 수도 있기 때문.
Set 컬랙션은 인덱스로 객체를 검색해서 가져오는 메소드가 없다. 대신 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator)를 제공한다.
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
리턴 타입 | 매소드명 | 설명 |
boolean | hasNext() | 가져올 객체가 있으면 true / 반대 false |
E | next() | 컬랙션에서 하나의 객체를 가져온다. |
void | remove() | Set 컬랙션에서 객체를 제거한다. |
Iterator에서 하나의 객체를 가져올 때는 next() 메소드를 사용한다.
next()메소드를 사용하기 전에 먼저 가져올 객체가 있는지 확인하는것이 좋다.
hasNext()메소드는 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴한다. 따라서 true가 리턴될 때 next()메소드를 사용해야 한다.
HashSet
HashSet을 생성
Set<E> set = new HashSet<E>();
Set<String> set = new HashSet<String>();
HashSet은 객체들을 순서없이 저장하고 동일한 객체는 중복 저장하지 않는다. HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스를 뜻하지 않는다.
HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode()메소드를 호출해서 해시코드를 얻어낸다.
그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다.
만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 배교해서 true가 나오면 동일한 객체로 판단하고 중복 저장하지 않는다.
package Part15_프레임워크.HashSet;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args){
Set<String> set = new HashSet<>();
set.add("Java");
set.add("JDBC");
set.add("Servlet/JSP");
set.add("Java");
set.add("iBATIS");
int size = set.size();
System.out.println("총 객체수 > "+size);
Iterator<String> iterator = set.iterator(); // 반복차 얻기
while (iterator.hasNext()){ // 객체 수만큼 루핑
String element = iterator.next(); // 한 개의 객체를 가져오기
System.out.println("\t" + element);
}
System.out.println();
set.remove("JDBC");
set.remove("iBATIS");
System.out.println("총 객체수 > " +set.size());
iterator = set.iterator(); // 반복자 얻기
while (iterator.hasNext()){
String element = iterator.next();
System.out.println("\t" + element);
}
System.out.println();
set.clear();
if(set.isEmpty()){
System.out.println("비어있다.");
}
}
}
hashCode()와 equals()메소드를 오버라이딩하는 예제
인스턴스가 달라도 이름과 나이가 동일하다면 동일한 객체로 간주하여 중복 저장 되지 않는다.
package Part15_프레임워크.HashSet;
public class Member {
public String name;
public int age;
public Member(String name, int age){
this.name = name;
this.age = age;
}
@Override //name과 age 값이 같으면 true를 리턴
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(){ //name과 age 값이 같으면 동일한 hashCode가 리턴
return name.hashCode() + age;
}
}
instanceOf
속성연산자 이고 형변환이 가능한지 해당 여부를 true.false로 가르쳐준다.
주로 부모객체인지 자식 객체 인지 확인하는데 사용한다.
package Part15_프레임워크.HashSet;
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("최민준", 30));
set.add(new Member("최민준", 30));
System.out.println("총 객체 수 > " + set.size());
}
}
'개발 > Java collection framework' 카테고리의 다른 글
[Java] LIFO와 FIFO 컬랙션 (0) | 2021.06.15 |
---|---|
[Java] Map 컬랙션 (0) | 2021.06.15 |
[Java] List 컬랙션 (0) | 2021.06.11 |
[Java] 컬렉션 프레임 워크란 (0) | 2021.06.11 |