java에서 set 인터페이스 사용 방법 상세 설명

java의 set 인터페이스는 다음과 같은 특징을 가지고 있다.
중복 요소가 나타나지 않도록 합니다.
집합 중의 원소 위치는 순서가 없습니다.
값이 null인 요소가 있습니다.
자바의 set 인터페이스는 수학적 set 추상을 모방하기 때문에 대응하는 수학적 set의 특성은 다음과 같다.
상호이성: 하나의 집합에서 모든 두 원소는 서로 다르다고 여긴다. 즉, 모든 원소는 한 번만 나타날 수 있다.
무질서성: 하나의 집합에서 모든 원소의 지위는 같고 원소 사이에는 무질서하다.집합에서 서열 관계를 정의할 수 있으며, 서열 관계를 정의하면 원소 간에 서열 관계에 따라 서열을 정할 수 있다.그러나 집합 자체의 특성에 대해 말하자면 원소 사이에는 필연적인 순서가 없다.
공집의 성질: 공집은 모든 집합의 서브집합이다
Set은 중복된 요소를 저장하지 않습니다.Set에서 가장 자주 사용되는 것은 귀속성을 테스트하는 것입니다. 어떤 대상이 어떤 Set에 있는지 쉽게 물어볼 수 있습니다.Set은 Collection과 동일한 인터페이스를 가지므로 추가 기능이 없습니다.사실 Set은 Collection입니다. 행동이 다를 뿐입니다.
Set 인터페이스를 실현한 것은 주로 HashSet, TreeSet, LinkedHashSet이 있는데 이 몇 가지 공통점은 같은 항목마다 하나만 저장한다는 것이다.그들도 다음과 같은 차이점이 있다.
1.HashSet:
HashSet은 상당히 복잡한 방식으로 요소를 저장하는데 HashSet을 사용하면 집합 중의 요소를 가장 빨리 얻을 수 있고 효율이 매우 높다(공간으로 시간을 바꾼다).hashcode와 equals에 따라 방단이 같은 대상인지, 만약hashcode가 같고, equals가true로 되돌아오면 같은 대상이므로 중복 저장할 수 없습니다.

package cn.set;

import java.util.HashSet;
import java.util.Set;

class Student{
 int id;
 public Student(int id) {
  this.id = id;
 }
 @Override
 public String toString() {
  return this.id+"";
 }
 @Override
 public int hashCode() {
  return this.id;
 }
 @Override
 public boolean equals(Object obj) {
  if (obj instanceof Student){
   Student stu = (Student) obj;
   if (stu.id == this.id)
    return true;
  }
  return false;
 }
}
public class HashSetTest {
 public static void main(String[] args) {
  Set<Student> set = new HashSet<Student>();
  Student s1 = new Student(1);
  Student s2 = new Student(1);
  Student s3 = new Student(2);
  set.add(s1);
  set.add(s2);
  set.add(s3);
  for (Student s : set) {
   System.out.println(s);
  }
 }
}

상술한 바와 같이hashCode () 와 equals () 방법을 다시 써서 동의 대상을 구분하면 같은 대상을 저장할 수 없습니다.이 두 가지 방법을 설명하면 모든 Student 객체는 서로 다른 객체로 간주되어 저장될 수 있습니다.
 2.TreeSet
TreeSet도 중복 객체를 저장할 수 없지만 TreeSet은 자동으로 정렬되고 저장된 객체를 정렬하지 못하면 오류가 발생하므로 저장된 객체는 정렬 규칙을 지정해야 합니다.정렬 규칙은 자연 정렬과 고객 정렬을 포함한다.
① 자연 정렬: TreeSet에서 추가할 대상을 대상 클래스에 추가합니다.lang. Comparable 인터페이스,comparaTo () 방법을 다시 쓰고 0을 되돌려주면 같은 대상, 그렇지 않으면 다른 대상입니다.
② 고객 정렬: 제3자 클래스를 구축하고java를 실현한다.util.Comparator 인터페이스.다시 쓰는 방법.집합 형식을 TreeSetts = new TreeSet(new 제3자 클래스()로 정의합니다.
다음 예제에서는 자연 정렬된 객체를 TreeSet으로 저장합니다.

package cn.set;

import java.util.Set;
import java.util.TreeSet;

class Student1 implements Comparable<Student1>{
 int id;
 public Student1(int id) {
  this.id = id;
 }
 @Override
 public String toString() {
  return this.id+"";
 }
 @Override
 public int hashCode() {
  return this.id;
 }
 @Override
 public boolean equals(Object obj) {
  if (obj instanceof Student1){
   Student1 stu = (Student1) obj;
   if (stu.id == this.id)
    return true;
  }
  return 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 = new Student1(5);
  Student1 s2 = new Student1(1);
  Student1 s3 = new Student1(2);
  Student1 s4 = new Student1(4);
  Student1 s5 = new Student1(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으로 고객 정렬 객체를 저장합니다.

package com.set;

import java.util.Set;
import java.util.TreeSet;

class Student1 implements Comparable<Student1>{
 int id;
 public Student1(int id) {
  this.id = id;
 }
 @Override
 public String toString() {
  return this.id+"";
 }
 @Override
 public int hashCode() {
  return this.id;
 }
 @Override
 public boolean equals(Object obj) {
  if (obj instanceof Student1){
   Student1 stu = (Student1) obj;
   if (stu.id == this.id)
    return true;
  }
  return 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 = new Student1(5);
  Student1 s2 = new Student1(1);
  Student1 s3 = new Student1(2);
  Student1 s4 = new Student1(4);
  Student1 s5 = new Student1(3);
  set.add(s1);
  set.add(s2);
  set.add(s3);
  set.add(s4);
  set.add(s5);
  for (Student1 s : set) {
   System.out.println(s);
  }
 }

}

출력 결과:
모두들 List를 저장할 때 삽입 순서에 따라 정렬하는 것을 알고 있습니다. 사실 자연 정렬과 고객 정렬로 List 집합을 정렬할 수도 있습니다. 보십시오.

package cn.set;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class MySort1 implements java.util.Comparator<Student3>{
 public int compare(Student3 o1, Student3 o2) {
  return o2.id-o1.id;
 }
}
class Student3 implements Comparable<Student3>{
 int id;
 public Student3(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<Student3>();
  Student3 s1 = new Student3(5);
  Student3 s2 = new Student3(1);
  Student3 s3 = new Student3(2);
  Student3 s4 = new Student3(4);
  Student3 s5 = new Student3(3);
  list.add(s1);
  list.add(s2);
  list.add(s3);
  list.add(s4);
  list.add(s5);
  System.out.println(list);
  // :
  Collections.sort(list);
  System.out.println(list);
  // 
  Collections.sort(list, new MySort1());
  System.out.println(list);
 }
}

출력 결과:
[5, 1, 2, 4, 3]
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
다음은 Java의 Set 컬렉션 인터페이스가 삽입 객체가 중복되지 않는 원리를 설명합니다.
자바의 집합에서 두 대상이 같은지 아닌지를 판단하는 규칙은 다음과 같다.
1), 두 객체의 해시코드가 동일한지 판단
만약 같지 않다면, 두 대상도 같지 않다고 생각하면, 완료
만약 같다면 2)
(이 점은 스토리지 효율성을 높이기 위한 것입니다. 이론적으로 없어도 되지만 그렇지 않으면 실제 사용 시 효율성이 크게 떨어질 수 있기 때문에 우리는 이를 필수적으로 생각합니다. 다음에 이 문제를 중점적으로 다루겠습니다.)
2), 두 대상이 equals 연산으로 동일한지 판단
만약 같지 않다면, 두 대상도 같지 않다고 생각한다
만약 같다면 두 대상이 같다(equals()는 것이 두 대상이 같은지 아닌지를 판단하는 관건이다)
일반 클래스의 객체(String과 같은 패키지 유형 객체를 제외하고):
일반 클래스에hashcode()와 equals() 방법이 없으면 그 대상은 비교할 때 계승된object클래스의hashcode() 방법이고object클래스의hashcode() 방법은 로컬 방법입니다. 이 방법의 반환값을 비교할 때 대상의 주소(인용 주소)를 비교합니다. new 방법으로 내용이 같은 대상을 만들고 두 번 생성한 것은 당연히 다른 대상입니다.해시코드 () 방법을 다시 쓰지 않는 한.object 클래스에 정의된 equals () 방법도 대상 주소에 대한 비교입니다.한마디로 요약: 일반 클래스의hashcode () 와 equals () 방법을 다시 쓰지 않으면 Set 집합에서 대상 인용 주소가 다르고 대상은 중복되지 않습니다.
String 등의 객체(String, Integer, Double//등):
이 봉인 클래스 자체가hashcode () 방법을 다시 썼고, 다시 쓰는 방법의 반환 값은 인용 주소가 아니라 대상의 내용과 관련이 있기 때문이다.이 봉인 클래스의 equals () 방법도 마찬가지로 다시 썼으며, 인용 주소가 아니라 대상의 내용을 비교했다.한마디로 요약하자면 String 등 유형의 대상은 집합에서 모두 그들의 내용을 비교하고 내용이 같으면 이미 존재하는 대상을 덮어쓴다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기