JAVA 데이터 구조의 HashSet 및 TreeSet 요약

5469 단어
Set 인터페이스
Set은 같은 요소를 포함할 수 없습니다. 같은 두 요소를 같은 집합에 넣으려면dd 방법은false로 되돌아옵니다.
Set은 두 대상이 같다고 판단하는데 == 연산자가 아니라 equals 방법에 따른다.즉 두 대상이 equals 방법으로 비교해서true로 되돌아오기만 하면 Set는 이 두 대상을 받아들이지 않는다는 것이다.일반적으로 Set 인터페이스를 실현하는 종류는 HashSet과 TreeSet 두 가지가 있다.
Set (집합) 은 동적 수조와 다르다. (우리는 동적 수조를 대략적으로List로 볼 수 있다.) 동적 수조 안의 원소는 순서가 있고 집합 안에는 없기 때문에HashSet에는 get () 방법과 set () 방법이 없다.
HashSetHashSet은 산 목록의 형식으로 Set 인터페이스를 실현한다.
HashSet은 다음과 같은 특징을 가지고 있다
  • 원소의 배열 순서를 보장할 수 없으며 순서가 변할 수 있음
  • 동기화되지 않음
  • 집합 원소는null일 수 있지만 하나만null(집합 중의 원소는 중복을 허용하지 않기 때문)
  • 해시셋 내부에서 중복을 허용하지 않는다면 해시셋은 어떻게 중복을 판단합니까?HashSet 결합에 대상을 저장할 때, HashSet은 대상의hashCode () 방법을 사용해서 대상의hashCode 값을 얻습니다.hashCode는 대상이 저장해야 할 물리 주소의 값을 되돌려줍니다. 이 물리 주소에 다른 대상이 없으면 이 대상을 이 물리 주소에 저장할 수 있습니다. 이 위치에 이미 다른 대상이 있다면.그러면 equals () 방법으로 두 대상의 내용이 같은지 비교하고, 내용이 같으면 두 대상이 같다는 것을 의미하며, 같지 않으면 대상을 부근의 다른 물리적 위치로 옮겨 저장한다.
    간단하게 말하면HashSet 집합이 두 대상의 상등을 판단하는 기준은 두 대상이 equals 방법을 통해 비교적 상등하고 두 대상의hashCode() 방법의 반환값이 상등하다는 것이다.
    대상을 HashSet에 넣으려면 대상에 대응하는 클래스의 equals 방법을 다시 쓰고hashCode () 방법을 다시 써야 합니다.그 규칙은 두 대상이 equals 방법을 통해true로 되돌아갈 때hashCode도 같아야 한다는 것이다.또한 대상에서 equals 비교 표준으로 사용되는 속성은hashCode의 값을 계산하는 데 사용해야 한다.
    객체의 유형이 JAVA 내부의 유형이라면 equals()와 hashCode() 방법을 다시 쓸 필요가 없습니다.만약 대상의 유형이 JAVA 내부의 유형이 아니라면 앞에서 언급한 두 가지 방법을 다시 써야 한다. 왜냐하면 JAVA 가상기는 사용자 정의 클래스의 대상의 내용을 어떻게 비교하는지 판단할 수 없기 때문이다.
    예제 코드는 다음과 같습니다.
    class Person{
    	private String name;
    	private int age;
    	public Person(String name,int age){
    		this.name = name;
    		this.age = age;
    	}
    	
    	public String toString(){
    		return name + ":"+age;
    	}
    	public boolean equals(Object x){
    		if(x instanceof Person == false) return false;
    		Person p = (Person)x;
    		return this.name.equals(p.name)&&this.age == p.age;
    	}
    	public int hashCode(){
    		return name.hashCode() + age;
    	}
    }
    public class HashSetTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		// 
    		Set st = new HashSet();
    		st.add(new Person("zhang", 10));
    		st.add(new Person("li", 10));
    		st.add(new Person("zhang", 17));
    		st.add(new Person("zhang", 10));
    		System.out.println(st);
    		
    		//JAVA 
    		Set a = new HashSet();
    		a.add("abc");
    		a.add("xyz");
    		a.add("abc");
    		System.out.println(a);
    	}
    }
    추가
    LinkedHashSet 집합은 원소의hashCode 값에 따라 원소의 저장 위치를 결정하지만, 체인 테이블을 사용하여 원소의 순서를 유지합니다.이렇게 하면 원소가 삽입 순서로 저장된 것처럼 보입니다. 즉, 이 집합을 두루 돌아다닐 때LinkedHashSet은 원소의 추가 순서로 집합된 원소에 접근합니다.
    LinkedHashSet은 Set의 모든 요소를 반복적으로 접근할 때 HashSet보다 성능이 좋지만 삽입할 때 성능은HashSet보다 약간 뒤떨어진다
    TreeSet 클래스 TreeSet은SortedSet 인터페이스의 유일한 실현 클래스입니다. TreeSet은 집합 요소가 정렬된 상태를 확보할 수 있습니다.TreeSet은 두 가지 정렬 방식을 지원하는데, 자연 정렬과 사용자 정의 정렬이다. 그 중에서 자연 정렬은 기본적인 정렬 방식이다.TreeSet에 동일한 클래스의 객체가 포함되어야 합니다.TreeSet이 두 대상이 같지 않다고 판단하는 방식은 두 대상이 equals 방법으로false를 되돌려주거나CompareTo 방법으로 0을 되돌려받았는지 비교하는 것이다. 0을 되돌려주면 두 대상이 같다는 뜻이다.자연 정렬 자연 정렬은 정렬할 요소의 CompareTo(Object obj) 방법을 사용하여 요소 간의 크기 관계를 비교한 다음 오름차순으로 정렬합니다.자바는 Comparable 인터페이스를 제공합니다. 이 인터페이스에compareTo (Object obj) 방법이 정의되어 있습니다. 이 방법은 정수치를 되돌려 인터페이스의 대상이 크기를 비교할 수 있도록 합니다.obj1.compareTo(obj2) 방법은 0을 반환하면 비교된 두 대상이 같다는 것을 설명하고, 정수를 반환하면 obj1이 obj2보다 크고, 마이너스라면 obj1이 obj2보다 작다는 것을 의미한다.만약에 우리가 두 대상의 equals 방법을 항상true로 되돌려준다면 이 두 대상의compareTo 방법은 0 맞춤형 정렬을 되돌려야 한다. 자연 정렬은 집합 요소의 크기에 따라 승차순으로 배열하고 맞춤형 정렬을 하려면Comparator 인터페이스를 사용하여 intcompare(To1, To2) 방법을 실현해야 한다.
    그렇다면 TreeSet은 어떤 방식으로 두 요소의 대상이 중복되는지 정의합니까?다음과 같은 두 가지 방법이 있습니다.
    사용자 정의 클래스는Comparable 인터페이스를 실현한 다음CompareTo() 방법을 다시 작성합니다.
    또 하나는 외부 심판을 초빙해 컴퍼니터 인터페이스를 실현하고 컴퍼니() 방법을 호출하는 것이다.
    구현 인스턴스는 다음과 같습니다.
    import java.util.*;
    
    /*
     class Person implements Comparable
     {
     private String name;
     private int age;
     public Person(String name, int age)
     {
     this.name = name;
     this.age = age;
     }
     @Override
     public int compareTo(Object o) {
     // TODO Auto-generated method stub
     if (o instanceof Person == false) return 0;
     Person p = (Person)o;
     int t = this.name.compareTo(p.name);
     if(t != 0)return t;
     return this.age - p.age;
     }
    
     public String toString(){
     return name + ":" + age;
     }
     }
     */
    class Person {
    	private String name;
    	private int age;
    
    	public Person(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    
    	public String toString() {
    		return name + ":" + age;
    	}
    	
    	public String getName(){
    		return this.name;
    	}
    	
    	public int getAge(){
    		return this.age;
    	}
    }
    
    class K implements Comparator {
    
    	@Override
    	public int compare(Object a, Object b) {
    		// TODO Auto-generated method stub
    		if (a instanceof Person == false || b instanceof Person == false)
    			return 0;//  a,b Person , , ,0 
    		Person p1 = (Person) a;
    		Person p2 = (Person) b;
    		int t = p2.getName().compareTo(p2.getName());
    		if (t != 0) return t;
    		return p1.getAge() - p2.getAge();
    	}
    
    }
    
    public class TreeSetTEST {
    	public static void main(String[] args) {
    		// Set a = new TreeSet();
    		Set a = new TreeSet(new K());
    		a.add(new Person("hao", 10));
    		a.add(new Person("hao", 20));
    		a.add(new Person("hao", 30));
    		a.add(new Person("hao", 10));
    		a.add(new Person("zhang", 10));
    		a.add(new Person("zhang", 11));
    		a.add(new Person("zhang", 20));
    		a.add(new Person("li", 40));
    
    		System.out.println(a);
    	}
    
    }

    좋은 웹페이지 즐겨찾기