Java의 세트 인터페이스에는 다음과 같은 특성이 있습니다.
반복 된 요소는 허용되지 않습니다.
세트의 요소는 순서대로 없습니다.
NULL 값을 가진 요소는 하나뿐입니다.
Java의 세트 인터페이스는 수학적 세트 추상화를 모방하기 때문에 해당 수학적 세트 특성은 다음과 같습니다.
상호 이성 : 세트에서 두 가지 요소가 다르게 간주됩니다. 즉, 각 요소는 한 번만 나타날 수 있습니다.
장애 : 세트에서 각 요소는 동일한 상태를 가지며 요소간에 무질서합니다. 순차적 관계는 세트에서 정의 될 수 있습니다. 순서 관계를 정의한 후에는 순서 관계에 따라 요소를 정렬 할 수 있습니다. 그러나 세트 자체의 특성 측면에서 요소간에 필요한 순서가 없습니다.
빈 세트의 특성 : 빈 세트는 모든 세트의 하위 집합입니다.
세트는 중복 요소를 저장하지 않습니다. 가장 일반적으로 사용되는 세트는 테스트 속성입니다. 객체가 세트에 있는지 쉽게 물어볼 수 있습니다. SET은 수집과 정확히 동일한 인터페이스를 가지므로 추가 기능이 없습니다. 실제로 세트는 컬렉션이지만 동작은 다릅니다.
세트 인터페이스를 구현하는 주요 사항은 Hashset, Treeset 및 LinkedHashset이며 각 동일한 항목의 공통점은 하나의 사본 만 저장됩니다. 또한 차이점이 있으며 차이점은 다음과 같습니다.
1. 해시 세트 :
Hashset은 매우 복잡한 방법을 사용하여 요소를 저장합니다. 해시 세트를 사용하면 컬렉션의 요소가 가능한 빨리 발생할 수 있으며 이는 매우 효율적입니다 (공간에서 거래 시간까지). Pangduan이 동일한 객체인지 여부는 해시 코드와 동등한 것을 기준으로 결정됩니다. 해시 코드가 동일하고 동일하게 반환되는 경우, 동일한 객체이며 반복적으로 저장할 수 없습니다.
패키지 cn.set; import java.util.hashset; import java.util.set; 클래스 학생 {int id; 공개 학생 (int id) {this.id = id; } @override public String toString () {return this.id+""; } @override public int ashcode () {return this.id; } @override public boolean equals (Object obj) {if (obj instance of indastof Student) {Student stu = (학생) obj; if (stu.id == this.id) true를 반환합니다. } false를 반환합니다. }} public class hashsettest {public static void main (string [] args) {set <tudent> set = new Hashset <student> (); 학생 S1 = 신입생 (1); 학생 S2 = 신입생 (1); 학생 S3 = 신입생 (2); set.add (S1); set.add (S2); set.add (s3); for (student s : set) {system.out.println (s); }}}위의 예에서 볼 수 있듯이 동의 객체를 구별하기 위해 hashcode () 및 equals () 메소드를 다시 작성한 후 동일한 객체를 저장할 수 없습니다. 이 두 가지 방법이 주석이 달리면 모든 학생 객체는 다른 물체로 간주되며 저장 될 수 있습니다.
2. 트리 세트
트리 셋은 중복 객체를 저장할 수 없지만 트리 세트는 자동으로 정렬됩니다. 저장된 객체를 정렬 할 수없는 경우 오류가보고되므로 저장된 개체는 정렬 규칙을 지정해야합니다. 정렬 규칙에는 자연 분류 및 고객 정렬이 포함됩니다.
① 자연 분류 : TreeSet을 추가하는 객체는 객체 클래스에서 java.lang.comparable 인터페이스를 구현하고 Comparato () 메소드를 무시합니다. 0을 반환한다는 것은 객체가 같은 객체라는 것을 의미합니다. 그렇지 않으면 다른 객체입니다.
Customer 정렬 : 타사 클래스를 만들고 java.util.comparator 인터페이스를 구현하십시오. 메소드를 다시 작성하십시오. 수집 양식 Treeset TS = New Treeset (New Third-Party Class ())를 정의합니다.
다음 예제는 treeset을 사용하여 자연적으로 분류 된 물체를 저장합니다.
패키지 cn.set; import java.util.set; import java.util.treeset; class student1 empless <student1> {int id; 공공 학생 1 (int id) {this.id = id; } @override public String toString () {return this.id+""; } @override public int ashcode () {return this.id; } @override public boolean equals (Object obj) {if (obj instanceof Student1) {Student1 stu = (Student1) obj; if (stu.id == this.id) true를 반환합니다. } false를 반환합니다. } public int compareto (Student1 o) {return (this.id-o.id); }} public class treesettest {public static void main (string [] args) {set <student1> set = new treeset <student1> (); Student1 S1 = 신입생 1 (5); 학생 1 S2 = 신입생 1 (1); Student1 S3 = 신입생 1 (2); Student1 S4 = 신입생 1 (4); Student1 S5 = 신입생 1 (3); set.add (S1); set.add (S2); set.add (s3); set.add (S4); set.add (S5); for (student1 s : set) {system.out.println (s); }}} 출력 결과는 다음과 같습니다.
다음 예제는 TreeSet을 사용하여 고객 분류 된 객체를 저장합니다.
패키지 com.set; import java.util.set; import java.util.treeset; class student1 empless <tudent1> {int id; 공공 학생 1 (int id) {this.id = id; } @override public String toString () {return this.id+""; } @override public int ashcode () {return this.id; } @override public boolean equals (Object obj) {if (obj instanceof Student1) {Student1 stu = (Student1) obj; if (stu.id == this.id) true를 반환합니다. } false를 반환합니다. } public int compareto (Student1 o) {return (this.id-o.id); }} public class treesettest {public static void main (string [] args) {set <student1> set = new treeset <student1> (); Student1 S1 = 신입생 1 (5); 학생 1 S2 = 신입생 1 (1); Student1 S3 = 신입생 1 (2); Student1 S4 = 신입생 1 (4); Student1 S5 = 신입생 1 (3); set.add (S1); set.add (S2); set.add (s3); set.add (S4); set.add (S5); for (student1 s : set) {system.out.println (s); }}} 출력 결과는 다음과 같습니다.
저장시 삽입 순서대로 목록이 정렬된다는 것을 누구나 알고 있습니다. 실제로 자연스러운 정렬 및 고객 정렬로 목록 컬렉션을 정렬 할 수도 있습니다. 참조하십시오 :
패키지 cn.set; import java.util.arraylist; import java.util.collections; import java.util.list; class mysort1은 java.util.comparator <student3> {public int compart (student3 o1, student3 o2) {return o2.id-o1.id; }} Class Student3은 비슷한 <tudly3> {int id; 공공 학생 3 (int id) {this.id = id; } @override public String toString () {return this.id+""; } public int compareto (Student3 o) {return (this.id-o.id); }} public class listsort {public static void main (String [] args) {list <student3> list = new ArrayList <Tody3> (); Student3 S1 = 신입생 3 (5); 학생 3 S2 = 신입생 3 (1); 학생 3 S3 = 신입생 3 (2); 학생 3 S4 = 신입생 3 (4); 학생 3 S5 = 신입생 3 (3); list.add (s1); list.add (s2); list.add (s3); list.add (s4); list.add (s5); System.out.println (목록); // 자연 분류 : collections.sort (list); System.out.println (목록); // 고객 정렬 컬렉션 .SORT (list, new MySort1 ()); System.out.println (목록); }} 출력 결과는 다음과 같습니다.
[5, 1, 2, 4, 3]
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
다음은 Java의 Set Collection 인터페이스가 객체 삽입의 복제를 구현하지 않는다는 원칙입니다.
Java 컬렉션에서 두 개의 객체가 동일한지 여부를 결정하는 규칙은 다음과 같습니다.
1) 두 객체의 해시 코드가 동일한지 확인
그것이 같지 않으면 두 객체가 같지 않은 것으로 간주됩니다. 동일하다면 2로 돌아갑니다.
(이것은 저장 효율성을 향상시키는 데만 필요합니다. 실제로 이론적으로는 없을 수 있지만, 그렇지 않은 경우 실제 사용 중에 효율이 크게 줄어들므로 여기서 필요할 것입니다.이 문제는 나중에 중점을 둘 것입니다.)
2) 두 객체가 Equals를 사용하여 똑같이 계산되는지 확인
그것이 동일하지 않다면, 두 객체가 같지 않다고 생각하십시오. 그것이 동일하다면, 두 객체가 같다고 생각합니다 (equals ()는 두 객체가 동일한지 판단하는 열쇠입니다)
일반 클래스 객체의 경우 (문자열과 같은 캡슐화 된 개체 제외) :
보통 클래스가 hashcode () 및 equals () 메소드를 무시하지 않으면 객체를 비교할 때 상속 된 객체 클래스의 hashcode () 메소드가 객체 클래스의 hashcode () 메소드는 로컬 메소드입니다. 메소드의 리턴 값을 비교할 때 객체 주소 (참조 주소)를 비교합니다. 새 방법을 사용하여 동일한 내용으로 객체를 만듭니다. 물론 다른 물체가 두 번 생성됩니다. hashcode () 메소드가 재정의되지 않는 한. 객체 클래스에 정의 된 equals () 메소드는 객체 주소를 비교하는 것입니다. 한마디로 : 보통 클래스의 hashcode () 및 equals () 메소드를 다시 작성하지 않으면 객체 참조 주소는 세트 컬렉션에서 다르며 객체는 반복되지 않습니다.
문자열 (문자열, 정수, 이중 ... 등)과 같은 객체의 경우 :
이러한 캡슐화 클래스 자체가 hashcode () 메소드를 다시 작성했으며, 다시 작성된 메소드의 리턴 값은 참조 주소가 아닌 객체의 내용과 관련이 있습니다. 이 캡슐화 된 클래스의 equals () 메소드도 참조 주소가 아닌 객체의 내용을 비교하여 다시 작성됩니다. 한 단어에서 문자열과 같은 클래스의 객체는 컬렉션에서 내용을 비교하고 동일한 내용을 덮어 쓰는 경우 기존 객체를 덮습니다.
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.