LinkedHashSetHashSet()
HashSet(Collectoin c)
HashSet(int initialCapacity)initialCapacity : 초기용량
보통은 2배로
HashSet(int initialCapacity, float loadFactor)
boolean add(Object o)boolean addAll(Collection c)boolean remove(Object o)boolean removeAll(Collection c)boolean retainAll(Collection c)void clear()boolean contains(Object o)boolean containsAll(Collection c)Object[] toArray()Object[] toArray(Object[] a)boolean isEmpty()int size()ex11_09
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Ex11_09 {
public static void main(String[] args) {
Object[] objArr = {"1", new Integer(1), "4", "2", "3", "3", "2", "4", "4"};
//중복허용하지 않기 때문에 각자 하나씩만! "1"과 1은 다르니 중복아님
Set set = new HashSet();
//HashSet에 objArr의 요소들을 저장
for(int i=0; i<objArr.length; i++) {
set.add(objArr[i]);
}
//HashSet에 저장된 객체들 출력
System.out.println(set); //이게 set.toString()과 같은건가??
//Iterator 이용한 출력
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
[1, 1, 2, 3, 4]
1
1
2
3
4
📢📢Set은 순서X -> sort() 없음 -> 정렬X
✨✨✨ list에 담으면 된다!!!!!
Set set = new HashSet(); ... List list = new LinkedList(set); List list = new ArrayList(set); //이런 식으로! 그후 정렬 Collections.sort(list);
ex11_10
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class Ex11_10 {
public static void main(String[] args) {
Set set = new HashSet();
//**set의 크기가 6보다 작은 동안
for(int i=0; set.size() < 6; i++) {
int num = (int)(Math.random()*45) + 1;
//1<= x < 46
// set.add(num); 오토박싱!
set.add(new Integer(num));
}
System.out.println(set); //***정렬X
//***정렬을 하기 위해선 1. set의 모든 요소를 list에 저장해야 한다.
List list = new LinkedList(set); //LinkedList(Collection c)
//2. 그 후 list 정렬!
Collections.sort(list); //Collections.sort(List list)
//***Arrays.sort(배열) --- Collections.sort(list)
//3. list 출력
System.out.println(list);
}
}
[38, 40, 27, 28, 13, 31]
[13, 27, 28, 31, 38, 40]
HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인한다.
같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.
✨✨add()는 저장하기 전에 equals()와 hashCode()를 호출하여 중복검사를 한다!!!
equals() & hashCode()는 Object클래스의 메소드이므로, 이걸 상속받아 ✨✨오버라이딩하여 사용한다.
💖💖우리가 만든 클래스를 HashSet에 저장하려면 반드시 equals(), hashCode()가 오버라이딩 되어 있어야 한다!!
ex11_11
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
public class Ex11_11 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("abc");
set.add("abc");
//중복처리(equals(), hashcode())로 저장안됨
set.add(new Person("David", 10));
set.add(new Person("David", 10));
//***내가 만든 클래스가 equals(), hashcode()오버라이딩 안돼있으면 중복처리 안됨
System.out.println(set);//오버라이딩한 toString
}
}
class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
//int hash(Object... value); 가변인자로 0~n개 가능!!
return Objects.hash(name, age);
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person)) return false;
//obj가 Person의 자손이냐
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String toString() {
return name+":"+age;
}
}
[David:10, abc]
ex11_12
import java.util.HashSet;
import java.util.Iterator;
public class Ex11_12 {
public static void main(String[] args) {
HashSet setA = new HashSet();
HashSet setB = new HashSet();
HashSet setHap = new HashSet();
HashSet setGyo = new HashSet();
HashSet setCha = new HashSet();
setA.add("1"); setA.add("2"); setA.add("3");
setA.add("4"); setA.add("5");
System.out.println("A = "+setA);
setB.add("4"); setB.add("5"); setB.add("6");
setB.add("7"); setB.add("8");
System.out.println("B = "+setB);
//**간단하게 메소드활용하면??
// setA.retainAll(setB); 교집합
// setA.removeAll(setB); 차집합
// setA.addAll(setB); 합집합
// System.out.println(setA);
//교집합..*B의 요소 하나하나를 A와 비교하기
//둘의 위치는 바꿔도 된당!
Iterator it = setB.iterator();
while(it.hasNext()) {
Object tmp = it.next();
if(setA.contains(tmp))//***A 기준
setGyo.add(tmp);
}
System.out.println("A∩B = "+setGyo);
//차집합..***A-B이면, A의 요소 하나하나를 B와 비교하기
it = setA.iterator();//**it는 한번만!!
while(it.hasNext()) {
Object tmp = it.next();
if(!setB.contains(tmp))
setCha.add(tmp);
}
System.out.println("A-B = "+setCha);
//합집합..***각각 넣으면 됨. 왜?? 중복허용 안하니까!!
it = setB.iterator();
while(it.hasNext())
setHap.add(it.next());
it = setA.iterator();
while(it.hasNext())
setHap.add(it.next());
System.out.println("A∪B = "+setHap);
}
}
A = [1, 2, 3, 4, 5]
B = [4, 5, 6, 7, 8]
A∩B = [4, 5]
A-B = [1, 2, 3]
A∪B = [1, 2, 3, 4, 5, 6, 7, 8]