LinkedHashSet
HashSet()
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]