sussa
컴퓨터가 할 일은 컴퓨터가.
sussa
전체 방문자
오늘
어제

블로그 메뉴

    • 분류 전체보기 (58)
      • Language (58)
        • JAVA (58)

    공지사항

    인기 글

    태그

    • 웹개발종합반
    • Method
    • Database
    • CSS
    • 개발자
    • Web
    • 캡슐화
    • 상속
    • Algorithm
    • recursion
    • 스파르타코딩클럽
    • Thread
    • Til
    • tree
    • 최종연산
    • Stream
    • 다형성
    • inheritance
    • Class
    • HTML
    • singleton
    • binaryTree
    • BinarySearchTree
    • 조건문
    • Instance
    • spring
    • 재귀
    • 자료구조
    • DI
    • java

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    sussa

    컴퓨터가 할 일은 컴퓨터가.

    Java Class HashSet (Interface Set)
    Language/JAVA

    Java Class HashSet (Interface Set)

    2022. 8. 28. 14:20

    🎯 목표 :  HashSet의 활용방법과 이해

    📒  HashSet

    ❗특징

    Interface Set의 메소드 출처 - 자바의 정석

     

    • Set 인터페이스를 구현한 대표 컬랙션 클래스
    • 순서가 없고 중복이 허용되지 않는다.
    • 순서를 유지하려면, LinkedHashSet 클래스를 사용하면 된다.
    • 객체를 추가할때 hashCode() , equals() 메소드를 호출하여 해시코드와 값을 비교하여 중복 값인지 확인하기 때문에,  기본형 객체 외 사용자 지정 데이터 객체를 입력할때는 hashCode()와 equals() 메소드를 오버라이딩 해야된다.

    📌 예제 1 ) HashSet은 순서가 없다. 

    import java.util.*;
    
    class HashSetStudy2 {
        public static void main(String[] args) {
            Set set = new HashSet();
    
            for (int i = 0; set.size() < 6 ; i++) {
                int num = (int)(Math.random()*45) + 1;
                set.add(num);
            }
            // 1~ 45 숫자중 6개 int값을 HashSet에 추가 한다.
            // HashSet는 순서가 없기 때문에 리스트를 출력하면 정렬되지 않은 난수로 출력된다.
            System.out.println(set);
    
    
            List list = new LinkedList(set); // List 형변환
            Collections.sort(list);          // 정렬 해줌
            System.out.println(list);
            // 정렬을 하기위해 List 타입으로 형변환을 하여 배열 구조를 만들어 기본 정렬 기준으로 정렬한다.
        }
    }
    출력값  # 실행할때마다 값이 변한다
    [33, 37, 6, 42, 28, 30] # 정렬 X
    [6, 28, 30, 33, 37, 42] # 정렬 O

    📌 예제 2 ) HashSet이 정상 작동을 위해 equals와 hashcode메소드를 오버라이딩 해줘야된다.

    import java.util.*;
    
    class HashSetStudy3 {
        public static void main(String[] args) {
            HashSet set = new HashSet();
            Person a = new Person("David",10);
            Person b = new Person("David",10);
            set.add(a);
            set.add(b);
            set.add("abc");
            set.add("abc");
    
            System.out.println("a.equals(b) = "+a.equals(b));
            System.out.println("a의 해시코드 = "+a.hashCode());
            System.out.println("b의 해시코드 = "+b.hashCode());
            System.out.println("HashSet = "+set);
        }
    }
    
    class Person {
        String name;
        int age;
    
        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String toString() {
            return name +":"+ age;
        }
    
    }
    출력값
    a.equals(b) = false
    a의 해시코드 = 1670782018
    b의 해시코드 = 1706377736
    HashSet = [abc, David:10, David:10]
    • 위의 코드는 Person의 객체 a,b 를 equals로 비교하게되면 false가 나오고 해시코드도 다르게 출력되기 때문에 같은 값으로 인식하지 않고 hashSet에 데이터를 저장하게 된다.
    • Person 클래스에 equals와 hashCode메소드를 아래와 같이 오버라이딩 해주면, HashSet이 의도한 대로 정상 작동 할것이다.
    class Person {
        String name;
        int age;
    
        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String toString() {
            return name +":"+ age;
        }
        // equals 와 hashcode 메소드를 오버라이딩 해줘야 HashSet이 정상 작동함
        public boolean equals(Object obj) {
            if(!( obj instanceof Person)) return false;
            Person p = (Person) obj;
            return this.name.equals(p.name) && this.age==p.age;
            // Person의 인스턴스 변수를 사용하기 위해서는 형변환을 해줘야
        }
        public int hashCode() {
            return Objects.hash(name,age);
        }
    }
    출력값
    a.equals(b) = true
    a의 해시코드 = 2039984119
    b의 해시코드 = 2039984119
    HashSet = [David:10, abc]

    'Language > JAVA' 카테고리의 다른 글

    Java HashMap (Interface Map)  (0) 2022.08.29
    Java Class TreeSet(Interface Set)  (0) 2022.08.28
    Java Comparator 와 Comparable  (0) 2022.08.28
    Java Class Arrays  (0) 2022.08.28
    Java Iterator  (0) 2022.08.28
      'Language/JAVA' 카테고리의 다른 글
      • Java HashMap (Interface Map)
      • Java Class TreeSet(Interface Set)
      • Java Comparator 와 Comparable
      • Java Class Arrays
      sussa
      sussa
      Efforts to take on a challenge

      티스토리툴바