HashSet은 어떻게 요소가 중복되지 않도록 합니까?

3783 단어
  • 1.HashSet 원리:
  • 우리가 Set 집합을 사용할 때 중복 요소를 제거해야 한다. 저장할 때 하나하나 equals()를 비교하면 효율이 비교적 낮다. 해시 알고리즘
  • 클래스 중복 제거 효율을 높이고 equals()의 사용 횟수를 낮춘다
  • HashSet에서dd() 방법으로 대상을 저장할 때 대상의hashCode() 방법을 먼저 호출한 다음 집합에서 해시 값이 같은 대상이 있는지 찾기
  • 해시 값이 같은 대상이 없으면 집합에 직접 저장
  • 해시 값이 같은 대상이 있으면 해시 값이 같은 대상과 하나씩 equals()필기를 하고 비교 결과false가 있으면 저장하고true는 저장하지 않는다
  • 2.사용자 정의 클래스의 대상을 HashSet에 저장해서 반복하기
  • 클래스에서hashcode()와 equals()를 다시 써야 하는 방법
  • hashcode(): 속성이 같은 반환값은 동일해야 하며, 속성이 다른 반환값은 가능한 한 다르다(효율 향상)
  • equals(): 속성이 같으면true로 되돌아오고 속성이 다르면false로 되돌아갈 때 저장

  • 정의된 Person 클래스
    package com.melody.bean;
    public class Person {
        private String name;
        private int age;
        /**
         *
         */
        public Person() {
            super();
    
        }
        /**
         * @param name
         * @param age
         */
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
        /**
         * @return the age
         */
        public int getAge() {
            return age;
        }
        /**
         * @param age the age to set
         */
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
        /**
         *     31?
         * 1.31     ,     1         
         * 2.31       
         * 3.31     2 5  -1,2      
         */
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Person other = (Person) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
    
    }
    
    

    다음은 테스트 클래스입니다.
    package com.melody.set;
    
    import java.util.HashSet;
    
    import com.melody.bean.Person;
    
    public class Demo1_HashSet {
        /**
         * @param args
         * Set  ,   ,     ,  (     )
         */
        public static void main(String[] args) {
    //        test1();
            HashSet hs = new HashSet<>();
            hs.add(new Person("  ", 23));
            hs.add(new Person("  ", 24));
            hs.add(new Person("  ", 23));
            hs.add(new Person("  ", 24));
            hs.add(new Person("  ", 23));
    
            //         ,     ,    HashCode equals  
            System.out.println(hs.size());
            System.out.println(hs);
        }
    
        private static void test1() {
            HashSet hs = new HashSet<>();
            hs.add("ce");
            boolean b1 = hs.add("a");
    //        boolean b2 = hs.add("a");
            hs.add("b");
            hs.add("c");
            hs.add("d");
            //HashSet   set            false
            //HashSet          set  
    //        System.out.println("b1 = " + b1 + " b2 = " + b2);
            System.out.println(hs);
    
            //               for  
            for (String string : hs) {
                System.out.println(string);
            }
        }
    
    }
    

    좋은 웹페이지 즐겨찾기