JAVA/JAVA수업

#15. Set

열하나요 2023. 7. 21. 16:21

15-1. Set

HashSet.

Value값만 저장하고 , index개념이 없다. 순서가 없고 중복이 없다!!

 

문자열만 담을 수 있는 HashSet을 만들어서 조작해보자.

HashSet<String> set = new HashSet();

set.add("순서가 정해져 있지 않다.");
set.add("이 스트링과");
set.add(new String("이 스트링과"));
set.add("는 같다.");

set.size();
set.remove("순서가 정해져 있지 않다.");
set.clear();

HashSet 메소드

add() :  요소 추가

size() : 요소 개수 (크기)

remove() : 요소 삭제

clear() : 모든 요소 삭제

 

HashSet의 특징 : 값이 추가가 될 때마다 equals()와 HashCode()로 비교 후 둘 다 결과가 true일 경우 동일 객체로 판단한다. => 동일 객체는 중복이라 추가될 수 없다!

두 students의 객체는 내용물은 같은데 주소값이 다르므로 둘 다 출력된다. 

왜? 위에 String "이 스트링과" 는 중복값으로 인정됐는데?

그건, String은 equals와 hashCode를 override 해줬기 때문.

Student도 똑같이 override 해주자.

HashSet<Student> students = new HashSet();

students.add(new Student("홍길동, 15, 100));
students.add(new Student("홍길동, 15, 100));

//=====================================================

public class Student {
	@Override
    public int hashCode() {
    	return (name + age + score).hashCode();
    }
    
    @Override
    public boolean equals(Object obj) {
    	Student other = (Student)obj;
        
        if(!this.name.equals(other.name) || this.age != other.age || this.score != other.score) {
        	return false;
        }
        return true;
    }
}

자동완성도 있음...  Alt + Shift + s -> h

 

 

HashSet은 인덱스가 없는데 값을 어떻게 빼는가.

1. 모두 출력

for(Student s : students) {
	System.out.println(s);
}

 

2. HashSet의 내용물을 AraayList에 담아서 인덱스를 이용해서 출력

ArrayList list = new ArrayList();
list.addAll(students);

 

3. Iterator를 통한 반복을 이용해서 출력

Iterator it = students.iterator();

while(it.hasNext()) {
	System.out.println(it.next());
}

iterator() : String의 StringTokenizer와 비슷한 원리. Set계열과 List계열에서만 호출이 가능하다!(Map에서는 바로 호출 불가능!)

 

 

'JAVA > JAVA수업' 카테고리의 다른 글

#17. Map, Network  (0) 2023.07.25
#16. Test2 / 과제  (0) 2023.07.24
#14. I.O(Writer/Reader), buffer, Collection, List  (0) 2023.07.20
#13. API, I.O(Input/Output)  (0) 2023.07.19
#12. 추상클래스, 인터페이스, 예외처리  (0) 2023.07.18