자바 기초의 컬렉션

목록 모음

각 요소는 해당 인덱스 순서가 정렬 반복적 세트의 세트의 요소의 목록.

단순히 equals 메소드를 비교하여, 두 개의 동일한 개체를 분석 목록 true를 반환합니다.

예를 들어 봐 :

public class A {
    public boolean equals(Object obj) {
        return true;
    }
}

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

public class ListTest2 {
    public static void main(String[] args) {
        List books = new ArrayList();
        books.add(new String("a"));
        books.add(new String("b"));
        books.add(new String("c"));
        System.out.println(books);
        books.remove(new A());
        System.out.println(books);
        books.remove(new A());
        System.out.println(books);
    }
}

당신이 객체가 있습니다 삭제하려고하면, 목록 A는 객체 요소의 집합을 비교하기 위해 equals 메소드를 호출합니다. 매개 변수로 요소 세트에 equals 메소드는,리스트 요소를 삭제하는 경우는 true를 돌려줍니다. 여기에 equals 메소드의 재 작성이 항상 true를 반환하고, 그래서 때마다 목록 모음에서 요소를 제거합니다.

ArrayList의 클래스

ArrayList의 클래스는 완전히 이전 목록 인터페이스를 설명하는 모든 기능을 지원하는 클래스 배열 기반 목록 구현입니다.

포장의 ArrayList 동적 허용 재분배 개체 [] 배열.

세트 모음

HashSet의 클래스

  • 어떤 시퀀스 요소의 요소 값 설정 널이 될 수 없다

  • 하여 동기 부호를 확인해야 동시에 HashSet의 컬렉션 변성 복수의 스레드를 가정 HashSet에 동기하지 않을 때

두 객체의 해시 코드 () 값이 같을 때 반환 HashSet의 동일 요소는, 두 객체를 비교하여 동일 등호 ()를 기준 결정된다.

해시 코드와 같은 대회에 맞춰 같다 : 사실 같음을 반환, 해시 코드가 동일해야합니다. 이 대회에서 자바 코드에 많은 도서관은 HashSet의 이러한 두 가지 방법을 사용하고 있습니다. 우리가 요구하는 이유는 클래스가 hashCode 메소드를 오버라이드 (override)하는 경우, 당신은 방법과 동일 오버라이드 (override) 할 필요가 있습니다, 그리고 라인의 계약의 이행을 보장하는 것입니다

포집 요소에 HashSet의은 HashSet의 오브젝트의 해시 코드의 목표 값을 획득하기 위해 해시 코드 () 메소드를 호출하고, 그 물체의 위치가 HashSet의 해시 코드 값에 따라 저장된 판정 된 경우.

각 슬롯은 HashSet의 엘리먼트를 호출 버킷 (버킷)를 저장할 수있다. 동일한 해시 코드의 복수의 요소의 값은, 그들이 비교 방법에 의해 반환되는 경우, 성능이 저하 될 수있는 물통의 요소, 복수 넣을 필요 거짓 같다. 이 경우, 당신은 클래스, 클래스의 재 작성이 equals 및 hashCode 메소드의 HashSet의 컬렉션에 객체를 저장하는 것이 좋습니다, 자신의 hashCode 메소드는 같은 값을 반환 true를 돌려 두 개체를 비교하여 방법을 같 확인하려고합니다.

HashSet의 변수에 객체를 추가 할 때 특히주의해야합니다, 그렇지 않으면 제대로 이러한 컬렉션의 요소에 액세스 할 수 없습니다 HashSet의로 이어질 것입니다, 계산 해시 코드 (), 인스턴스 변수가 동일 () 메소드에 관련된 변수 개체를 수정하지 않으려 고.

예를 들어 봐 :

public class R {
    int count;
    public R(int count) {
        this.count = count;
    }
    public String toString() {
        return "R[count:" + count + "]";
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass() == R.class) {
            R r = (R)obj;
            return this.count == r.count;
        }
        return false;
    }
    public int hashCode() {
        return this.count;
    }
}

import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest2 {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        hs.add(new R(5));
        hs.add(new R(-3));
        hs.add(new R(9));
        hs.add(new R(-2));
        System.out.println(hs);
        Iterator it = hs.iterator();
        R first = (R)it.next();
        first.count = -3;
        System.out.println(hs);
        hs.remove(new R(-3));
        System.out.println(hs);
        System.out.println("hs 是否包含 count 为 -3 的 R 对象" + hs.contains(new R(-3)));
        System.out.println("hs 是否包含 count 为 -2 的 R 对象" + hs.contains(new R(-2)));
    }
}

/*
[R[count:-2], R[count:-3], R[count:5], R[count:9]]
[R[count:-3], R[count:-3], R[count:5], R[count:9]]
[R[count:-3], R[count:5], R[count:9]]
hs 是否包含 count 为 -3 的 R 对象false
hs 是否包含 count 为 -2 的 R 对象false
*/

LinkedHashSet의 클래스

LinkedHashSet의 HashSet의 하위 마찬가지로 소자 해시 코드 값의 저장 위치에 기초하여 결정된다. LinkedHashSet의 요소의 컬렉션을 통과 할 때, LinkedHashSet의 요소의 순서의 요소를 추가하여 컬렉션을 방문 할 수 있도록 그러나 요소 목록의 사용 순서를 유지합니다.

LinkedHashSet의이 삽입 순서를 유지할 필요가 성능이 HashSet의보다 약간 낮은했지만, 모든 요소 반복에 설정에 액세스 할 때 그 내부 질서를 유지하기 위해 나열되어 있기 때문에, 좋은 성능을해야합니다.

TreeSet의 클래스

이름이 세트 모음의 일종이다 있듯이 TreeSet의 SortedSet의 인터페이스 구현 클래스이다.

TreeSet의 요소의 집합을 저장하는 데 사용되는 트리 맵 구현 레드 - 블랙 트리 데이터 구조를 기초. 자연 정렬 및 사용자 지정 순서 : TreeSet의 두 가지 분류 방법을 지원합니다. 기본적으로 자연 순서를 사용하여.

자연 순서

자바 인터페이스는 compareTo와 (개체 OBJ) 메소드를 정의, Comparable 인터페이스를 제공합니다. 인터페이스를 구현하는 클래스는 추상 메소드를 구현해야합니다.

다음은 compareTo (개체 OBJ) 비교 규칙은 다음과 같습니다

  • obj1.compareTo (obj2보다)이 동일 나타내는 0이 반환
  • obj1.compareTo (obj2보다)의 OBJ1> obj2보다 나타내는 0보다 큰 값을 반환
  • obj1.compareTo (obj2보다)의 OBJ1 <obj2보다 나타내는 0보다 작은 값을 리턴

TreeSet의이 소자의 크기 사이의 관계를 비교 compareTo와 요소 (오브젝트 OBJ)에있어서의 설정을 호출하고 오름차순 요소의 집합이 자연 순서이다. 그래서 자연적 요소 객체의 종류는 Comparable 인터페이스를 구현해야합니다.

두 물체 즉 compareTo와 (오브젝트 OBJ)를 비교하여 동일한 경우, 반환 값은 TreeSet의 그들이 동일하다고, 새로운 객체는 TreeSet의 컬렉션에 추가되지 않으며 0이다.

당신이 TreeSet의가 제대로 작동하려면, TreeSet의는 동일한 유형의 개체를 추가 할 수 있습니다.

사용자 정의 정렬

사용자 지정 정렬을 원하는 경우에, 당신은 당신이 개체의 TreeSet의 수집, 비교기 TreeSet의와 관련된 개체의 컬렉션을 만들 때 필요합니다. 비교기 인터페이스 식 대신 람다 사용될 수 함수이다.

종류를 사용자 정의하여, 여전히 TreeSet의에 서로 다른 유형의 개체, 그렇지 않은 경우는 ClassCastException 예외를 추가 할 수 없습니다. 비교기는 두 개의 요소를 0과 비교하여 리턴하므로 두 번째 요소 컬렉션에 추가 TreeSet의 않을 :이 때, 요소들의 세트는 두 개의 조건과 동일하게 결정된다.

import java.util.TreeSet;

public class TreeSettest4 {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet((o1, o2) -> {
            M m1 = (M) o1;
            M m2 = (M) o2;
            return m1.age > m2.age ? -1 : m1.age < m2.age ? 1: 0;
        });
        ts.add(new M(5));
        ts.add(new M(-3));
        ts.add(new M(9));
        System.out.println(ts);
    }
}

TS 컬렉션 정렬 담당하는 람다 식 비교기에 대한 상기 타겟 유형을 사용. Comparable 인터페이스를 구현하지 않고 모든 M 클래스,하지만 람다에 대한 책임 요소의 종류 TreeSet의 연결을 식입니다.

compareTo 메소드를 구현하는 경우, 강하게 그렇지 않으면 이상한 오류가 발생할 수 있습니다, 동등한 결과와 일관성이 좋습니다. 일부 재현성을 결정하기 때문에 동일 클래스는 천연 x.compareTo (Y) == 0 일종의 이용이 결정된다. compareTo와 같은 요소 여부 결정의 주문 위치하기 때문에, 결정은 동일한 결정하는 것 같다, 평등의 종류에 요소의 위치를 ​​결정하는 것입니다, 그래서 우리는 동일해야 동일 주문 매우 동일한 위치를 확인해야합니다.

각각 EnumSet 클래스

각각 EnumSet은 각각 EnumSet의 모든 요소 유형 열거 클래스를 열거 지정해야합니다, 열거 클래스 디자인 컬렉션을 위해 설계, 열거 타입은 각각 EnumSet의 생성에 명시 적 또는 암시를 지정합니다.

포집 요소 각각 EnumSet하는 클래스 열거 모음 요소를 결정하기 위해 열거 된 값의 순서로 정렬된다. 각각 EnumSet의 컬렉션이 null 요소의 삽입을 허용하지 않습니다.

내부 각각 EnumSet 콤팩트하고 효율적인, 매우 작은 메모리 풋 프린트, 높은 동작 효율의 형태로 저장되는 비트 벡터로 표현. 특히 통화 나 retainAll containsAll 나 방법 및 시간 등의 대량 작업 중에.

지도 모음

정의 : 매핑 관계를 가진 데이터를 저장하기위한지도 한 관계가 키와 값 사이에 존재하는 한 방법은, 키가 고유해야합니다.

설정 맵과의 관계는 매우 가까운 경우이고 키가, 그 가치는 클라이언트의 키 값으로 키 - 값 쌍. 이 치료로지도 설정을 처리 할 수 ​​있습니다.

실제로,지도 항목은 내부 키 - 값 쌍을 캡슐화하는 클래스를 제공하며, 키 입력 항목 저장 패키지의 계산을 고려. 보기 소스 코드의 관점에서, 자바는지도를 달성하기 위해, 그리고 null 값의 모든는 포장하여지도 설정 컬렉션 실현된다.

HashMap의 구현 클래스

HashMap의 키 객체로 hashCode () 메소드와 같음 () 메소드를 구현해야합니다으로 사용.

동일한 HashMap의 두 가지 항목을 분석하는 것은 () 메소드이 개 같음을 비교하여 실제 키를 반환, 해시 코드이 키 값도 동일하다.

두 개의 동일한 값 결정 기준 해시 맵 :있어서 해당 두 개체가 같음을 전달할 수 리턴 ().

그리고 HashSet에 유사 키로서 HashMap의 클래스 정의를 사용할 때, 만약 재정의 등호 () 메소드와 hashCode () 메소드는, 기준, 즉 두 일관된 방법되어야 할 때 두 개의 등호 키 ( 방법 해당 비교 반환), 두 키 해시 코드 () 메소드는 값이 동일해야 반환한다.

HashSet의 유사하게 사용하는 경우 프로그램의 핵심 변수로 개체를 수정하지 않으려 다음, 키의 HashMap으로 변수 개체를 사용하지 않으려 고.

의 LinkedHashMap 구현 클래스

의 LinkedHashMap는 키 - 값 쌍의 순서를 유지하기 위해 이중 연결리스트를 사용하여지도 키 - 값 쌍을 삽입 순서와 일치 반복 순서 목록 반복 질서 유지에 대한 책임, (실제로는 단지 키의 순서를 고려할 필요가있다).

import java.util.LinkedHashMap;

public class LinkedHashMapTest {
    public static void main(String[] args) {
        LinkedHashMap scores = new LinkedHashMap();
        scores.put("Chinses", 80);
        scores.put("English", 82);
        scores.put("Math", 76);
        scores.forEach((key ,value) -> System.out.println(key + "--->" + value));
    }
}

TreeMap의 구현 클래스

트리 맵은 레드 - 블랙 트리 데이터 구조, 즉, 레드 - 블랙 트리 노드로 각각의 키 - 값 쌍이다. TreeMap의 저장 키 - 값 쌍의 노드는 노드 키를 정렬 할 필요가있다. 트리 맵 보장 할 질서 상태에서 모든 키 - 값 쌍있다.

정렬 두 종류 :

  • 자연 순서 : 그렇지 않으면 ClassCastException를 슬로우합니다, 모든 키 트리 맵은 Comparable 인터페이스를 구현해야하고, 모든 키가 같은 클래스의 대상이되어야한다.
  • 사용자 정의 종류 : 당신은 트리 맵을 만들 때, 모든 키 트리 맵은 정렬을 담당하는 비교기 객체를 전달합니다. Comparable 인터페이스를 구현하는 사용자 정의 종류의 키를 사용하는 경우지도가 필요하지 않습니다

트리 맵 결정은 두 가지 주요 조건과 동일하다 : 두 개의 키를 반환 compareTo 메소드 0 내지.

두 가지 핵심의 비교 방법과 같다 : 당신이 TreeMap의 좋은 일을 허용하기 위해, 키 트리 맵으로 사용자 정의 클래스를 사용하는 경우 TreeSet의처럼, 우리는 동등한를 재 작성의 종류는 () 메서드은 compareTo () 메소드 일관된 결과를 유지해야 0을 반환해야합니다 compareTo 메소드에 의해 그들을 비교, true를 돌려줍니다.

compareTo 메소드를 구현하는 경우, 강하게 그렇지 않으면 이상한 오류가 발생할 수 있습니다, 동등한 결과와 일관성이 좋습니다. 일부 재현성을 결정하기 때문에 동일 클래스는 천연 x.compareTo (Y) == 0 일종의 이용이 결정된다. compareTo와 같은 요소 여부 결정의 주문 위치하기 때문에, 결정은 동일한 결정하는 것 같다, 평등의 종류에 요소의 위치를 ​​결정하는 것입니다, 그래서 우리는 동일해야 동일 주문 매우 동일한 위치를 확인해야합니다.

공식 문서 :

거의 Comparable를 구현하는 대부분의 Java 코어 클래스는 equals와 일관성이있는 자연 순서가 있습니다.

EnumMap는 구현 클래스

열쇠는 EnumMap는 하나의 열거 클래스의 열거 값이어야합니다.

EnumMap는 다음과 같은 특징이 있습니다 :

  • EnumMap는 배열로 내부적으로 저장된

  • 키 EnumMap는 천연 서열 (열거 클래스에 열거 값, 즉 시퀀스)는 키 - 값 쌍의 순서를 유지하도록

  • EnumMap는 키 값은 null이 아닌

당신이 클래스 EnumMap는을 만들 때 열거를 지정해야하고, 따라서 EnumMap는 연관된 열거 클래스를 지정했습니다.

나는 대중 번호의 관심을 환영합니다

추천

출처www.cnblogs.com/Tianny/p/11619659.html