1. hashSet
[표현법]
Hashset<generic> 객체명= new HashSet();
2. set의 특징: 중복값을 저장하지 않는다
1) HashSet이 값의 중복여부를 판단하는 방법
각 요소에 대하여 equals, hashCode 메서드 실행 후 둘다 true일 시 동일값으로 판단
=> HashSet의 요소로 String이 들어오면...
String 클래스에선 equals 와 hashCode가 주소값이 아닌 문자열을 비교하도록 오버라이딩 되어있음
* equals (boolean)==> 문자열 비교하여 같으면 true반환
hashCode (int)==> 문자열 비교하여 같으면 , 같은 값(객체의 주소값을 해싱하여 10진수 형태로 반환값) 을 반환
HashSet<String> hs =new HashSet(); // 제네릭 설정
System.out.println(hs);
2) hashSet의 요소로 String형이 들어오면:
HashSet<Student> stds = new HashSet();
stds.add(new Student("가나", 15, 100));
stds.add(new Student("다라", 15, 100));
stds.add(new Student("마바", 15, 100));
stds.add(new Student("사아", 15, 100));
stds.add(new Student("사아", 15, 100));
-> stds 출력시 :
HashSet클래스는 값 저장시, 동일값으로 판단되는 값들은 중복저장하지 않는데,
위 두 줄은 다른 값으로 인지
동일값여부 판단 기준은
<1. hashcode가 일치하고, 2.equals가 true인지> 여부
위 두 줄은 new연산자를 통해 객체를 생성하였으므로
서로 다른 주소값을 가짐 (equals->true, hashCOde ->불일치)
HashSet<String> hs =new HashSet(); // 제네릭 설정
-> 값추가
hs.add("안녕하세요~");
hs.add(new String ("환영해요"));
hs.add("환영해요");
-> hs 출력시 : 위 두 줄은 중복저장 불가
주소값이 다름에도 불구하고 같은 것으로 인식한다
1) String클래스에서는 hashCode, equals함수가 오버라이딩되어
주소값이 아닌 실제 문자열을 비교함
2) 상기 두 줄의 경우 객체 주소값은 상이
(윗줄은 heap영역, 아래줄은 heap 영역의 String pool의 주소값 참조)
3) 따라서 중복여부 확인을 위해
equals, hashCode()를 돌릴시 true, 일치 반환받음
==>같은 값으로 인지
=> 중복저장이 일어나지 않는다
3) String외 기타Class에서 주소값이 아닌 실제 값으로 중복여부를 판단하게 하려면:
String클래스처럼 실제 내용을 비교하도록 equals와 hashCode메서드를 오버라이딩
단축키: Alt+ Shift + s=> Generate equals and HashCode
3.hashset메소드
boolean add(E e) | set에 전달된 요소를 추가함. (선택적 기능) |
void clear() | 해당 집합의 모든 요소를 제거함. (선택적 기능) |
boolean contains(Object o) | 해당 집합이 전달된 객체를 포함하고 있는지를 확인함. |
boolean equals(Object o) | 해당 집합과 전달된 객체가 같은지를 확인함. |
boolean isEmpty() | 해당 집합이 비어있는지를 확인함. |
Iterator<E> iterator() | 해당 집합의 반복자(iterator)를 반환함. |
boolean remove(Object o) | 해당 집합에서 전달된 객체를 제거함. (선택적 기능) |
int size() | 해당 집합의 요소의 총 개수를 반환함. |
Object[] toArray() | 해당 집합의 모든 요소를 Object 타입의 배열로 반환함. |