HashSet(),
HashSet(Collection C),
HashSet(int initialCapacity) - 초기용량을 정해줌
HashSet(int initialCapacity, float loadFactor) - 초기용량을 언제 늘릴건지 (float loadFactor0.8은 80%)
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) : object가 포함되어 있는지?
boolean containsAll(Collection c) : 여러 객체가 모두 포함되어 있는지?
boolean isEmpty() : 비었는지?
int size() : 저장된 객체수
Object[] toArray() : set에 저장되있는 객체를 객체배열로 반환
// SetA.retainAll(SetB); // 교집합
SetA.addAll(SetB); // 합집합
System.out.println(SetA);
public static void main(String[] args) {
Object[] objarr = {"1", new Integer(1), "2","2","3","3"};
Set set = new HashSet();
for (int i = 0; i < objarr.length; i++) {
set.add(objarr[i]); // Hashset에 objarr의 요소들 저장
}
System.out.println(set); // set에 저장된 요소들 출력
// [1, 1, 2, 3] 출력
// 중복된 것은 출력되지 않음 !!! (1은 "1", 1 으로 타입이 다르므로 출력)
// Iterator란 자바의 컬렉션(Collection)에 저장되어 있는 요소들을 순회하는 인터페이스이다.
// 사용방법 : Iterator<T> iterator = Collection.iterator();
// 읽어올 다음 요소가 있는지 판단하는 hasNext() / 다음 요소를 가져오는 next() / 가져온 요소를 삭제하는 remove() 메소드 사용 가능
// HashSet에 저장된 요소들 출력(Iterator이용)
Iterator it = set.iterator();
while (it.hasNext()) { // 데이터를 꺼내서 있는지 확인 (true, false return) 가지고 있는 데이터중 하나를 끄집어내서 존재하는지를 알아보는 것이다. 존재하면 true, 존재하지 않으면 false.(boolean)
System.out.println(it.next());
} // 읽어올 요소가 없을때까지 계속 반복. 실제로 Member를 itr에서 끄집어낸다. 그러면 끄집어 낸 Member는 더이상 itr에는 남아있지 않게 된다.
// set의 특징 : 순서를 유지하지 않고 중복된 요소를 허용하지 않는다 !!
}
public class set2_pr_main_4 {
public static void main(String[] args) {
Set set = new HashSet();
// set의 크기가 6보다 작은 동안 1~45사이의 난수를 저장
for (int i = 0; set.size() < 6; i++) {
int num = (int)(Math.random() * 45) + 1;
// set.add(new Integer(num));
//컴파일러가 자동으로 아래처럼 변환
set.add(num);
}
// 정렬되지 않은 상태로 나옴
//정렬 : 순서 유지가 되어야 하는데 set은 정렬불가
// set을 list로 넘기고 list를 정렬하면 된다.
// 1. set의 모든 요소를 List에 저장
// 2. List를 정렬
// 3. List를 출력
List list = new LinkedList(set); // LinkedList(Collection c) . 1
Collections.sort(list); // 2
System.out.println(list); // 3
}
}
// mbr_set 에 저장되어진 Member 객체들 중에서 id가 "kimth" 인 객체만 정보를 출력해본다.
Iterator<Member> itr = mbr_set.iterator();
// mbr_set 에 저장된 모든 Member 객체 정보가 담아진다.
String id = "kimth";
boolean isExist = false;
while (itr.hasNext()) { //데이터가 있는지 확인
Member mbr = itr.next(); // itr에 담긴 객체 member의 정보를 가져온다. -> 그 정보는 더이상 itr에는 남아 있지 않다.(itr는 일회성)
if(id.equals(mbr.getId())) {
isExist = true;
System.out.println(mbr);
}
}
if(!isExist) {
System.out.println(">> 아이디가 "+id+" 인 회원은 없습니다.<<");
}
// mbr_set 에 저장되어진 Member 객체들 중에서 id 값이 "kimth" 인 객체를 삭제하세요
itr = mbr_set.iterator(); // 일회성이므로 다시 코드 입력
while(itr.hasNext()) {
Member mbr = itr.next();
if("kimth".equals(mbr.getId())) {
itr.remove();
// mbr_set 에 저장된 요소(Element)를 삭제하려면
// Iterator를 이용한 itr.remove(); 을 사용하여 삭제한다.
}
}// end of while---------------------------
System.out.println(">>> kimth 을 삭제한 후 모든 객체 정보 출력하기 <<<");
itr = mbr_set.iterator();
while(itr.hasNext()) {
Member mbr = itr.next();
System.out.println(mbr);
}// end of while---------------------------
HashSet은 객체를 저장하기 위해 기존에 같은 객체가 있는지 확인해야 함 (있으면 저장하지 않음) - list는 확인 안하고 다 저장(중복 허용하니까)
public static void main(String[] args) {
System.out.println("\n === HashSet === \n");
// Member 클래스의 객체만을 저장할 수 있는 HashSet 객체 mbr_set 을 생성한다.
Set<Member> mbr_set = new HashSet<>();
// Member 클래스의 객체를 mbr_set 에 저장한다.
mbr_set.add(new Member("youjs","Qwer1234$","유재석","7209101"));
mbr_set.add(new Member("eom","Qwer1234$","엄정화","6808152"));
mbr_set.add(new Member("kanghd","Qwer1234$","강호동","7006151"));
mbr_set.add(new Member("leess","Qwer1234$","이순신","0010203"));
mbr_set.add(new Member("kimth","Qwer1234$","김태희","0105064"));
mbr_set.add(new Member("kimth","Qwer1234$","김태희","0105064")); // 메모리상 주소 다름
Member mem1 = new Member("kwonjy","Qwer1234$","권지용","0303203");
Member mem2 = mem1;
mem2.setName("지드래곤"); // 지드래곤 1번밖에 출력 안됨
mbr_set.add(mem1);
mbr_set.add(mem2); // 중복된 데이터를 저장할 수 없다.!!!
// mbr_set 에 저장되어진 모든 Member 객체들의 정보를 출력해본다.
Iterator<Member> itr = mbr_set.iterator();
while(itr.hasNext()) {
// itr.hasNext() 은
// itr 에서 현재 itr가 가지고 있는 여러 Member 데이터중
// 하나를 끄집어내서 존재하는지를 알아보는 것이다.
// 존재하면 true, 존재하지 않으면 false.
Member mbr = itr.next();
// 실제로 Member를 itr 에서 끄집어낸다.
// 그러면 끄집어 낸 Member는 더이상 itr 에는 남아있지 않게 된다.
System.out.println(mbr);
}// end of while---------------------------
System.out.println("\n~~~~~~~~~~~~~~~~~~~\n");
위 코드에서 김태희는 중복된 값임에도 메모리 주소가 다르기 때문에 중복 제거가 안되고 출력이 된다.
만약 같은 값도 중복을 제거하고 싶다면
Member 클래스에 equals() 와 hashCode()를 오버라이딩 한다. (generate에 hashcode() , equals() 오버라이딩) 아래와 같이 작성된다.
public class Member {
@Override
public boolean equals(Object obj) {
if( !(obj instanceof Member) ) return false;
Member mbr = (Member)obj; // obj 객체에는 name이란 field가 없으므로 강제로 member 클래스 형변환
//자식 타입으로 강제형변환 시 자식에 있는 것을 가져다 쓸수 있음
// 나 자신의 아이디,비밀번호,이름, 주민번호를 mbr과 비교
return this.id.equals(mbr.id) &&
this.passwd.equals(mbr.passwd) &&
this.name.equals(mbr.name) &&
this.jubun.equals(mbr.jubun);
}
@Override
public int hashCode() {
return Objects.hash(id, passwd, name, jubun);
}
private String id;
private String passwd;
private String name;
private String jubun;
public Member() {}
public Member(String id, String passwd, String name, String jubun) {
this.id = id;
this.passwd = passwd;
this.name = name;
this.jubun = jubun;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJubun() {
return jubun;
}
public void setJubun(String jubun) {
this.jubun = jubun;
}
public String gender() {
if(jubun == null) {
return "";
}
else {
if("1".equals(jubun.substring(6)) ||
"3".equals(jubun.substring(6)) ) {
return "남";
}
else {
return "여";
}
}
}// end of public String gender()--------------------------------
// 메소드의 오버라이딩(재정의)
@Override
public String toString() {
// toString은 자동으로 호출
return "=== "+name+"님의 회원정보 ===\n"
+ "1.아이디 : "+id+"\n"
+ "2.비밀번호 : "+passwd+"\n"
+ "3.성명 : "+name+"\n"
+ "4.주민번호 : "+jubun+"\n"
+ "5.성별 : "+gender()+"\n"
+ "6.만나이 : "+MyUtil.age(jubun)+"세\n";
}
public class Set_main_5 {
public static void main(String[] args) {
System.out.println("\n === HashSet === \n");
// Member 클래스의 객체만을 저장할 수 있는 HashSet 객체 mbr_set 을 생성한다.
Set<Member> mbr_set = new HashSet<>();
// Member 클래스의 객체를 mbr_set 에 저장한다.
mbr_set.add(new Member("youjs","Qwer1234$","유재석","7209101"));
mbr_set.add(new Member("eom","Qwer1234$","엄정화","6808152"));
mbr_set.add(new Member("kanghd","Qwer1234$","강호동","7006151"));
mbr_set.add(new Member("leess","Qwer1234$","이순신","0010203"));
mbr_set.add(new Member("kimth","Qwer1234$","김태희","0105064"));
mbr_set.add(new Member("kimth","Qwer1234$","김태희","0105064"));
Member mem1 = new Member("kwonjy","Qwer1234$","권지용","0303203");
Member mem2 = mem1;
mem2.setName("지드래곤");
mbr_set.add(mem1);
mbr_set.add(mem2); // 중복된 데이터를 저장할 수 없다.!!!
// mbr_set 에 저장되어진 모든 Member 객체들의 정보를 출력해본다.
Iterator<Member> itr = mbr_set.iterator();
while(itr.hasNext()) {
// itr.hasNext() 은
// itr 에서 현재 itr가 가지고 있는 여러 Member 데이터중
// 하나를 끄집어내서 존재하는지를 알아보는 것이다.
// 존재하면 true, 존재하지 않으면 false.
Member mbr = itr.next();
// 실제로 Member를 itr 에서 끄집어낸다.
// 그러면 끄집어 낸 Member는 더이상 itr 에는 남아있지 않게 된다.
System.out.println(mbr);
}// end of while---------------------------
System.out.println("\n~~~~~~~~~~~~~~~~~~~\n");
// mbr_set 에 저장되어진 Member 객체들 중에서 id가 "kimth" 인 객체만 정보를 출력해본다.
String id = "kimth";
itr = mbr_set.iterator();
boolean isExist = false;
while(itr.hasNext()) { // 읽어볼 데이터가 존재하면 true
Member mbr = itr.next(); // 모든 정보를 끄집어내온다.
if(id.equals(mbr.getId())) {
isExist = true;
System.out.println(mbr);
}
}// end of while---------------------------
if(!isExist) {
System.out.println(">> 아이디가 "+id+" 인 회원은 없습니다.<<");
}
// mbr_set 에 저장되어진 Member 객체들 중에서 id 값이 "kimth" 인 객체를 삭제하세요
itr = mbr_set.iterator();
while(itr.hasNext()) {
Member mbr = itr.next();
if("kimth".equals(mbr.getId())) {
itr.remove();
// mbr_set 에 저장된 요소(Element)를 삭제하려면
// Iterator를 이용한 itr.remove(); 을 사용하여 삭제한다.
}
}// end of while---------------------------
System.out.println(">>> kimth 을 삭제한 후 모든 객체 정보 출력하기 <<<");
itr = mbr_set.iterator();
while(itr.hasNext()) {
Member mbr = itr.next();
System.out.println(mbr);
}// end of while---------------------------
////////////////////////////////////////////////////////
System.out.println("\n === LinkedHashSet === \n");
// Member 클래스의 객체만을 저장할 수 있는 LinkedHashSet 객체 mbr_set2 을 생성한다.
Set<Member> mbr_set2 = new LinkedHashSet<>();
// Member 클래스의 객체를 mbr_set2 에 저장한다.
mbr_set2.add(new Member("youjs","Qwer1234$","유재석","7209101"));
mbr_set2.add(new Member("eom","Qwer1234$","엄정화","6808152"));
mbr_set2.add(new Member("kanghd","Qwer1234$","강호동","7006151"));
mbr_set2.add(new Member("leess","Qwer1234$","이순신","0010203"));
mbr_set2.add(new Member("kimth","Qwer1234$","김태희","0105064"));
mbr_set2.add(new Member("kimth","Qwer1234$","김태희","0105064"));
Member mem3 = new Member("kwonjy","Qwer1234$","권지용","0303203");
Member mem4 = mem3;
mem4.setName("지드래곤");
mbr_set.add(mem3);
mbr_set.add(mem4); // 중복된 데이터를 저장할 수 없다.!!!
// mbr_set2 에 저장되어진 모든 Member 객체들의 정보를 출력해본다.
Iterator<Member> itr2 = mbr_set2.iterator();
while(itr2.hasNext()) {
// itr2.hasNext() 은
// itr2 에서 현재 itr2가 가지고 있는 여러 Member 데이터중
// 하나를 끄집어내서 존재하는지를 알아보는 것이다.
// 존재하면 true, 존재하지 않으면 false.
Member mbr = itr2.next();
// 실제로 Member를 itr2 에서 끄집어낸다.
// 그러면 끄집어 낸 Member는 더이상 itr2 에는 남아있지 않게 된다.
System.out.println(mbr);
}// end of while---------------------------
System.out.println("\n~~~~~~~~~~~~~~~~~~~\n");
// mbr_set2 에 저장되어진 Member 객체들 중에서 id가 "kimth" 인 객체만 정보를 출력해본다.
String id2 = "kimth";
itr2 = mbr_set2.iterator();
boolean isExist2 = false;
while(itr2.hasNext()) {
Member mbr = itr2.next();
if(id2.equals(mbr.getId())) {
isExist2 = true;
System.out.println(mbr);
}
}// end of while---------------------------
if(!isExist2) {
System.out.println(">> 아이디가 "+id2+" 인 회원은 없습니다.<<");
}
// mbr_set2 에 저장되어진 Member 객체들 중에서 id2 값이 "kimth" 인 객체를 삭제하세요
itr2 = mbr_set2.iterator();
while(itr2.hasNext()) {
Member mbr = itr2.next();
if("kimth".equals(mbr.getId())) {
itr2.remove();
// mbr_set2 에 저장된 요소(Element)를 삭제하려면
// Iterator를 이용한 itr2.remove(); 을 사용하여 삭제한다.
}
}// end of while---------------------------
System.out.println(">>> kimth 을 삭제한 후 모든 객체 정보 출력하기 <<<");
itr2 = mbr_set2.iterator();
while(itr2.hasNext()) {
Member mbr = itr2.next();
System.out.println(mbr);
}// end of while---------------------------
}// end of main()---------------------------------
}