Set 커넥터(Hashset LinkedHashset Treeset)
10257 단어 linkedhashset
Set 커넥터(HashSet, TreeSet 및 LinkedHashSet)
Set은 같은 요소를 포함할 수 없습니다. 같은 두 요소를 같은 집합에 넣으려면dd 방법은false로 되돌아옵니다.Set은 두 대상이 같다고 판단하는데 == 연산자가 아니라 equals 방법에 따른다.즉 두 대상이 equals 방법으로 비교해서true로 되돌아오기만 하면 Set는 이 두 대상을 받아들이지 않는다는 것이다.
사실1:set은 맵에 해당하는kay입니다.
사실2:hashSet은 빠른 검색을 위한 set이고hashSet에 저장된 요소는hashCode를 정의해야 합니다.한편,treeSet은 순서를 유지하는 set이다.treeSet을 사용하면 set에서 질서정연한 서열을 추출할 수 있고 요소는 반드시 conparable 인터페이스를 실현해야 한다.그러나
링크HashSet은hashSet의 조회 속도를 가지고 내부는 체인 테이블 구조이기 때문에linkedHashSet을 두루 돌아다닐 때 결과는 삽입 순서에 따라 표시됩니다!
HashSetHashSet은 다음과 같은 특징이 있습니다.원소의 배열 순서를 보장할 수 없습니다. 순서가 변할 수 있습니다. 동기화되지 않은 집합 원소는null일 수 있지만 하나만null을 넣을 수 있습니다. HashSet 결합에 원소를 저장할 때 HashCode() 방법으로 대상의hashCode 값을 얻어서hashCode 값에 따라 대상이 HashSet에 저장되는 위치를 결정합니다.간단하게 말하면HashSet 집합이 두 원소의 상등을 판단하는 기준은 두 대상이 equals 방법을 통해 비교적 상등하고 두 대상의hashCode() 방법의 반환값이 상등하다는 것이다. 만약에 한 대상을 HashSet에 넣으려면 해당 대상이 대응하는 equals 방법을 다시 쓰고hashCode() 방법을 다시 써야 한다.그 규칙은 두 대상이 equals 방법을 통해true로 되돌아갈 때hashCode도 같아야 한다는 것이다.또한 대상에서 equals 비교 표준으로 사용되는 속성은hashCode의 값을 계산하는 데 사용해야 한다.
demo1:
set , equals hashCode , 。
import java.util.HashSet;
import java.util.Set;
public class overwriteHahcodeAndEquals {
public static void main(String[] args) {
Set<Object> set = new HashSet<Object>();
set.add(new Student("lopez",23));
set.add(new Student("lopez",23));
set.add(new Student("shengliang",33));
set.add(new Student("weikun",23));
set.add(new Student("chencheng",28));
System.out.println(set);
//output:[set.Student@1420a8f4, set.Student@9b725c34, set.Student@c2ce75cf, set.Student@8d6b816e]
// 4
}
}
class Student{//
String name;
int age;
public Student(String name , int age){
this.name = name;
this.age = age;
}
public int hashCode(){// hsahCode
return age*name.hashCode();
}
public boolean equals(Object o){// equals
Student s = (Student)o;
return s.age == this.age && s.name.equals(this.name);
}
}
1.각각 hashCode와 equals 인터럽트 debug에서 발견Set에 새 대상을 삽입할 때 먼저 이 대상의hashCode()와 이미 존재하는 대상의hashCode()를 비교한다. 만약 같으면 삽입할 수 없고, 같지 않으면 equals() 방법을 호출할 수 있다. 만약에 equals 결과가true라면 이미 존재한다는 것을 설명하고 더 이상 삽입할 수 없다.false라면 삽입할 수 있다.
2.hashSet은 각각 문자열 대상을 삽입합니다.
set.add(new String("asd"));
set.add(new String("asd"));
//set asd, String, hashCode , hashCode 。
demo2:
4
package set;
import java.util.HashSet;
import java.util.Set;
public class overwriteHahcodeAndEquals {
public static void main(String[] args) {
Set<Object> set = new HashSet<Object>();
set.add(new Student("lopez",23));
set.add(new Student("lopez",23));
set.add(new Student("shengliang",33));
set.add(new Student("weikun",23));
set.add(new Student("chencheng",28));
System.out.println(set);
//output:[set.Student@c2ea3f, set.Student@1d5550d, set.Student@c21495, set.Student@1186fab, set.Student@14b7453]
// 5
}
}
class Student{//
String name;
int age;
public Student(String name , int age){
this.name = name;
this.age = age;
}
}
demo2에 대한 작은 테스트를 실시했다.package set; import java.util.HashSet; import java.util.Set; public class overwriteHahcodeAndEquals { public static void main(String[] args) { Set<Object> set = new HashSet<Object>(); Student stu = new Student("lopez",23); Student stu1 = new Student("lopez",23); System.out.println("stu hashCode :" + stu.hashCode()); System.out.println("stu1 hashCode :" + stu1.hashCode()); System.out.println("stu stu1 equals " + stu.equals(stu1)); set.add(stu); set.add(stu1); set.add(new Student("shengliang",33)); set.add(new Student("weikun",23)); set.add(new Student("chencheng",28)); System.out.println(set); } } class Student{// String name; int age; public Student(String name , int age){ this.name = name; this.age = age; } /*public int hashCode(){ return age*name.hashCode(); } public boolean equals(Object o){ Student s = (Student)o; return s.age == this.age && s.name.equals(this.name);//int String }*/ }
다음 출력을 통해 알 수 있습니다.
//output:stu의hashCode값은:18378667
//stu1의 hashCode 값은 21722195입니다.
//stu와 stu1 equals 비교false
/[set.Student@c2ea3f, set.Student@1d5550d, set.Student@c21495, set.Student@1186fab, set.Student@14b7453]
대상을 다시 쓰지 않는 equals와hashCode 방법은stu와stu1대상이 equals와hashCode를 비교해 얻은 값이 같지 않기 때문에 5개의 대상을 얻는다.
LinkedHashSetLinkedHashSet 집합은 원소의hashCode 값에 따라 원소의 저장 위치를 결정하지만, 체인 테이블을 사용하여 원소의 순서를 유지합니다.이렇게 하면 원소가 삽입 순서로 저장된 것처럼 보입니다. 즉, 이 집합을 두루 돌아다닐 때LinkedHashSet은 원소의 추가 순서로 집합된 원소에 접근합니다.Linked HashSet은 Set의 모든 요소를 반복적으로 접근할 때 HashSet보다 성능이 좋지만, 삽입할 때 성능은 HashSet보다 약간 뒤떨어진다. 삽입할 때linked HashSet은 체인 구조를 유지해야 하기 때문이다.
package set;
import java.util.HashSet;
import java.util.LinkedHashSet;
public class CompareHashSetAndLinkedHashSet {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet set = new LinkedHashSet();
set.add("lopez1");
set.add("lopez2");
set.add("lopez3");
set.add("lopez4");
for (Object obj : set) {
System.out.println(obj.toString());
}
//output:
//lopez1
//lopez2
//lopez3
//lopez4
HashSet set1 = new HashSet();
set1.add("lopez1");
set1.add("lopez2");
set1.add("lopez3");
set1.add("lopez4");
for (Object obj : set1) {
System.out.println(obj.toString());
}
//lopez1
//lopez4
//lopez3
//lopez2
}
}
TreeSet 클래스 TreeSet은SortedSet 인터페이스의 유일한 실현 클래스입니다. TreeSet은 집합 요소가 정렬된 상태를 확보할 수 있습니다.TreeSet은 두 가지 정렬 방식을 지원하는데, 자연 정렬과 사용자 정의 정렬이다. 그 중에서 자연 정렬은 기본적인 정렬 방식이다.TreeSet에 동일한 클래스의 객체가 포함되어야 합니다.TreeSet이 두 대상이 같지 않다고 판단하는 방식은 두 대상이 equals 방법으로false를 되돌려주거나,CompareTo 방법으로 0을 되돌려주지 않은 자연정렬을 비교하거나, 정렬할 원소의CompareTo(Object obj) 방법으로 원소 간의 크기 관계를 비교한 후 원소를 승차순으로 배열하는 것이다.자바는 Comparable 인터페이스를 제공합니다. 이 인터페이스에compareTo (Object obj) 방법이 정의되어 있습니다. 이 방법은 정수치를 되돌려 인터페이스의 대상이 크기를 비교할 수 있도록 합니다.obj1.compareTo(obj2) 방법은 0을 반환하면 비교된 두 대상이 같다는 것을 설명하고, 정수를 반환하면 obj1이 obj2보다 크고, 마이너스라면 obj1이 obj2보다 작다는 것을 의미한다.만약에 우리가 두 대상의 equals 방법을 항상true로 되돌려준다면 이 두 대상의compareTo 방법은 0 맞춤형 정렬을 되돌려야 한다. 자연 정렬은 집합 요소의 크기에 따라 승차순으로 배열하고 맞춤형 정렬을 하려면Comparator 인터페이스를 사용하여 intcompare(To1, To2) 방법을 실현해야 한다.
자연 순으로 데모1:
package set;
import java.util.TreeSet;
import java.util.Iterator;
public class TestTreeSet
{
public static void main(String[] args)
{
TreeSet tree = new TreeSet();
tree.add("China");
tree.add("America");
tree.add("England");
tree.add("Japan");
tree.add("Chinese");
tree.add("lapez");
tree.add("lopez");
tree.add("lopez1");
Iterator iter = tree.iterator();
while(iter.hasNext())
{
System.out.println(iter.next());
}
}
//output: America
//China
//Chinese
//England
//Japan
//lapez
//lopez
//lopez1
}
정렬 사용자 정의하기
package set;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TestTreeSet {
/** *//**
* @param args
*/
public static void main(String[] args) {
MyComparator<String> myComparator = new MyComparator<String>();
// /////////////////////
TreeSet<String> treeSet1 = new TreeSet<String>();
treeSet1.add("c");
treeSet1.add("a");
treeSet1.add("b");
Iterator<String> iterator1 = treeSet1.iterator();
while (iterator1.hasNext()) {
System.out.println(iterator1.next());
}
// /////////////////////
TreeSet<String> treeSet2 = new TreeSet<String>(myComparator);
treeSet2.add("c");
treeSet2.add("a");
treeSet2.add("b");
Iterator<String> iterator2 = treeSet2.iterator();
while (iterator2.hasNext()) {
System.out.println(iterator2.next());
}
}
}
class MyComparator<T> implements Comparator<T> {
public int compare(T arg0, T arg1) {
if (arg0.equals(arg1)) {
return 0;
}
return ((Comparable<T>) arg0).compareTo(arg1) * -1;
}
}