자바 용기 상세 분석

13668 단어 자바용기.
앞에서 말 했 듯 이 자바 개발 에서 우 리 는 반드시 집합 을 대량으로 사용 할 것 이다.여기 서 나 는 흔히 볼 수 있 는 집합 류,모든 집합 류 의 장점 과 단점 을 정리 하여 우리 가 집합 을 더욱 잘 사용 할 수 있 도록 할 것 이다.다음은 제 가 그림 으로 표시 하 겠 습 니 다.

그 중에서 연두색 은 인 터 페 이 스 를 나타 내 고 빨간색 은 우리 가 자주 사용 하 는 종 류 를 나타 낸다.
1:기본 개념
자바 용기 클래스 라 이브 러 리 의 용 도 는 저장 대상 으로 2 개 개념 으로 나 눌 수 있다.
1.1:Collection
하나의 독립 된 요소 의 서열,이 요소 들 은 모두 하나 이상 의 규칙 에 따른다.그 중에서 List 는 삽 입 된 순서에 따라 요 소 를 저장 해 야 합 니 다.Set 는 중복 되 는 요소 가 있어 서 는 안 됩 니 다.Queue 는 줄 서기 규칙 에 따라 대상 의 생 성 순 서 를 확인 해 야 합 니 다.(보통 삽입 순서 와 같 습 니 다)
1.2:Map
쌍 을 이 루 는 값 키 는 대상 에 대해 키 로 값 을 찾 을 수 있 습 니 다.Array List 는 숫자 로 값 을 찾 을 수 있 도록 합 니 다.숫자 와 대상 을 연결 합 니 다.맵 은 대상 을 사용 하여 대상 을 찾 을 수 있 도록 해 주 며 관련 배열 이 라 고도 불 린 다.사전
2:List
List 는 요 소 를 특정한 시퀀스 에 유지 할 수 있 도록 약속 합 니 다.List 인 터 페 이 스 는 Collection 을 바탕 으로 대량의 방법 을 추가 하여 List 중간 에 요 소 를 삽입 하고 제거 할 수 있 습 니 다.다음은 주로 2 가지 List 를 소개 하 겠 습 니 다.
2.1:기본 Array List
무 작위 접근 요소 가 빠 르 지만 중간 에 삽입 하고 제거 하 는 것 이 느 린 것 이 장점 이다.
그럼 이제 Array List 의 무 작위 접근 이 빠 르 고 삽입 제거 가 느 린 이 유 를 살 펴 보 겠 습 니 다.Array List 초기 화 에 대해 먼저 말씀 드 리 겠 습 니 다.
Array List 는 다음 과 같이 세 가지 방식 으로 초기 화 됩 니 다.

private transient Object[] elementData;
public ArrayList() {
    this(10);
  }
 public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
      throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
    this.elementData = new Object[initialCapacity];
  }
 public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
      elementData = Arrays.copyOf(elementData, size, Object[].class);
  }
Array List 는 배열 을 사용 한 것 임 을 알 수 있 습 니 다.모든 Array List 는 읽 을 때 배열 과 같은 효율 을 가지 고 있 으 며 시간 복잡 도 는 1 이다.
끝 부분 을 삽입 하면 elementData[size+]=e;물론 중간 에 확 대 를 진행 하 겠 습 니 다.지금 은 중간 삽입 이 왜 상대 적 으로 느 린 소스 코드 가 다음 과 같 습 니까?

public void add(int index, E element) {
    rangeCheckForAdd(index);//  (     )
    ensureCapacityInternal(size + 1); // Increments modCount!!(            )
    System.arraycopy(elementData, index, elementData, index + 1,
             size - index);(    )
    elementData[index] = element;
    size++;
  }
System.arraycopy(element Data,index,element Data,index+1)첫 번 째 매개 변 수 는 소스 배열,소스 배열 의 시작 위치,목표 배열,목표 배열 의 시작 위치,배열 요소 수 를 복사 합 니 다.그러면 이 뜻 은 index 에서 모든 요 소 를 뒤로 이동 시 키 고 마지막 으로 색인 을 index 로 비 우 며 element 를 할당 하 는 것 입 니 다.이렇게 되면 우 리 는 어느 위 치 를 삽입 해 야 할 지 모 르 기 때문에 일치 하 는 시간 대 입 도 는 n 입 니 다.
2.2:LinkedList
이것 은 대가 가 비교적 낮 아서 List 중간 에 삽입 하고 제거 함으로써 최 적 화 된 순서 접근 을 제 공 했 지만 무 작위 접근 은 상대 적 으로 느리다.하지만 그의 특성 기능 은 Array List 보다 훨씬 강하 다.Queue 와 Stack 지원
Listed List 는 체인 저장 소 를 사용 합 니 다.체인 저장 소 는 노드 노드 노드 를 정 합 니 다.세 부분 전구 노드,후계 노드 와 data 값 을 포함한다.그래서 저장 할 때 그의 물리 적 주 소 는 반드시 연속 되 는 것 이 아니다.
우 리 는 그것 의 중간 삽입 실현 을 보 았 다.


코드 를 통 해 알 수 있 듯 이 먼저 색인 요 소 를 삽입 하 는 전구 노드 를 가 져 온 다음 에 이 요 소 를 후계 노드 로 한 다음 에 새로운 노드 를 만 들 고 새로운 노드 전구 노드 는 전구 노드 를 가 져 오 는 것 과 같 으 며 후계 노드 는 이동 할 이 요소 와 같다.그래서 여 기 는 순환 이 필요 없 기 때문에 삽입 과 삭제 할 때 효율 이 높다.
우 리 는 조 회 를 보 러 왔 다.(우 리 는 그것 의 효율 이 Array List 보다 훨씬 낮 다 는 것 을 분석 할 수 있다.)

3:Set
Set 도 하나의 집합 이지 만 그의 특징 은 중복 되 는 대상 이 있어 서 는 안 된다 는 것 이다.그래서 Set 에서 가장 자주 사용 하 는 것 은 귀속 성 을 테스트 하 는 것 이다.어떤 대상 이 Set 에 존재 하 는 지 쉽게 물 어 볼 수 있다.또한 Set 는 Collection 과 똑 같은 인 터 페 이 스 를 가지 고 있 으 며 별도의 기능 이 없고 표현 하 는 행위 만 다르다.
3.1:HashSet
HashSet 조회 속도 가 비교적 빠 르 지만 저 장 된 요 소 는 무 작위 로 정렬 되 지 않 았 습 니 다.다음은 제 가 프로그램 을 써 서 보 겠 습 니 다.

public static void main(String[] args){
    /**
     *       ,    hashset      (      )
     */
    Random random=new Random(47);
    Set<Integer> intset=new HashSet<Integer>();
    for (int i=0;i<10000;i++){
      intset.add(random.nextInt(30));
    }
    System.out.print(intset);
  }

3.2:TreeSet
TreeSet 은 요 소 를 빨간색-검 은 나무 구조 에 저장 하기 때문에 저 장 된 결 과 는 순서 가 있 습 니 다.(따라서 자신 이 저장 한 집합 에 순서 가 있 으 려 면 TreeSet 을 선택 하 십시오)

public static void main(String[] args){
    Random random=new Random(47);
    Set<Integer> intset=new TreeSet<Integer>();
    for (int i=0;i<10000;i++){
      intset.add(random.nextInt(30));
    }
    System.out.print(intset);
  }

링크 드 HashSet 뒤에 대해 서 얘 기 하 자.
4:Queue
Queue 는 대기 열 입 니 다.대기 열 은 전형 적 인 선진 적 인 용기 입 니 다.용기 의 한 끝 에 요 소 를 넣 고 다른 한 끝 에서 꺼 내 는 것 입 니 다.그리고 요 소 를 용기 에 넣 는 순서 와 꺼 내 는 순서 가 같 습 니 다.LinkedList 는 Queue 에 대한 실현 을 제공 하고 LinkedList 는 위로 Queue 로 전환 합 니 다.그 중에서 Queue 는 offer,peek,element,pool,remove 등 방법 이 있 습 니 다.
offer 는 요 소 를 줄 끝 에 삽입 하고 false 로 돌아 가 추가 에 실 패 했 음 을 표시 합 니 다.peek 와 element 는 모두 제거 되 지 않 은 상태 에서 적 수 를 되 돌려 줍 니 다.그러나 peek 는 적 수 를 null 일 때 null 로 되 돌려 줍 니 다.element 는 NoSuchElement Exception 이상 을 던 집 니 다.poll 과 reove 방법 은 적 수 를 제거 하고 되 돌려 줍 니 다.그러나 poll 은 대기 열 에 null 이 고 reove 는 NoSuchElement Exception 이상 을 던 집 니 다.다음은 예 입 니 다.

public static void main(String[] args){
    Queue<Integer> queue=new LinkedList<Integer>();
    Random rand=new Random();
    for (int i=0;i<10;i++){
      queue.offer(rand.nextInt(i+10));
    }
    printQ(queue);
    Queue<Character> qc=new LinkedList<Character>();
    for (char c:"HelloWorld".toCharArray()){
      qc.offer(c);
    }
    System.out.println(qc.peek());
    printQ(qc);
    List<String> mystrings=new LinkedList<String>();
    mystrings.add("1");
    mystrings.get(0);
    Set<String> a=new HashSet<String>();
    Set<String> set=new HashSet<String>();
    set.add("1");
  }
  public static void printQ(Queue queue){
    while (queue.peek

위의 출력 결 과 를 통 해 알 수 있 듯 이 결 과 는 순서 가 아 닙 니 다.규칙 이 없습니다.이 럴 때 대기 열 을 규칙 에 따라 출력 시 키 려 면 이 럴 때 우선 순 위 를 고려 해 야 합 니 다.이 럴 때 Priority Queue 를 사용 해 야 합 니 다.이 럴 때 offer 방법 으로 대상 을 삽입 할 때...이 대상 은 우선 순위 에 따라 열 에 정렬 됩 니 다.기본 적 인 상황 은 자 연 스 럽 게 정렬 됩 니 다.물론 우 리 는 Comparator 를 통 해 이 순 서 를 수정 할 수 있 습 니 다(다음 설명).Priority Queue 는 peek,pool,remove 방법 을 호출 할 때 가 져 온 요 소 는 열 에서 우선 순위 가 가장 높 은 요소 가 될 것 임 을 확인 할 수 있 습 니 다.ok 코드 를 통 해 다시 한 번 확인 하 겠 습 니 다.

public static void main(String[] args) {
    PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>();
    Random rand = new Random();
    for (int i = 0; i < 10; i++) {
      priorityQueue.offer(rand.nextInt(i + 10));
    }
    QueueDemo.printQ(priorityQueue);
    List<Integer>ints= Arrays.asList(25,22,20,18,14,9,3,1,1,2,3,9,14,18,21,23,25);
    priorityQueue=new PriorityQueue<Integer>(ints);
    QueueDemo.printQ(priorityQueue);
  }

출력 에서 볼 수 있 듯 이 중복 은 허용 되 며,최소 값 은 최고 우선 순위(String 이 라면 빈 칸 도 값 이 라 고 할 수 있 으 며,알파벳 보다 높 은 우선 순위)를 가지 고 있 습 니 다.중복 을 없 애 려 면 Set 로 저장 한 다음 Set 을 priority Queue 대상 의 초기 값 으로 사용 하면 됩 니 다.
5:Map
Map 은 실제 개발 에서 매우 광범 위 하 게 사용 되 고 있 습 니 다.특히 HashMap 은 우리 가 대상 중의 일부 요소 의 값 을 저장 해 야 한다 고 상상 해 보 세 요.만약 에 우리 가 대상 을 만 드 는 것 이 좀 번 거 로 워 보인다 면 이 럴 때 우 리 는 map 를 사용 할 수 있 습 니 다.HashMap 은 해시 함수 이기 때문에 문의 효율 이 비교적 높 습 니 다.만약 우리 가 질서 있 는 것 이 필요 하 다 면 우 리 는 TreeMap 을 사용 하 는 것 을 고려 할 수 있다.HashMap 의 방법 을 소개 합 니 다.HashMap 의 키 는 null 일 수 있 으 며,키 값 은 중복 되 지 않 으 며,중복 되면 첫 번 째 키 값 을 덮어 씁 니 다.
put 는 값 키 쌍 을 추가 합 니 다.containsKey 인증 은 주로 존재 하 는 지,containsValue 인증 값 이 존재 하 는 지,keyset 은 모든 키 집합 을 가 져 오고 values 는 모든 값 집합 을 가 져 오고 entry Set 은 키 쌍 을 가 져 옵 니 다.

public static void main(String[] args){
    //Map<String,String> pets=new HashMap<String, String>();
    Map<String,String> pets=new TreeMap<String, String>();
    pets.put("1","  ");
    pets.put("2","  ");
    pets.put("3","  ");
    if (pets.containsKey("1")){
      System.out.println("    1");
    }
    if (pets.containsValue("  ")){
      System.out.println("      ");
    }
    Set<String> sets=pets.keySet();
    Set<Map.Entry<String , String>> entrySet= pets.entrySet();
    Collection<String> values= pets.values();
    for (String value:values){
      System.out.println(value+";");
    }
    for (String key:sets){
      System.out.print(key+";");
    }
    for (Map.Entry entry:entrySet){
      System.out.println(" :"+entry.getKey());
      System.out.println(" :"+entry.getValue());
    }
  }

6:Iterator 와 Foreach
현재 foreach 문법 은 주로 배열 에 작용 하지만 그 는 모든 Collection 대상 에 도 응용 할 수 있다.Collection 이 foreach 를 사용 할 수 있 는 이 유 는 Iterator 라 는 인 터 페 이 스 를 계승 하기 때 문 입 니 다.다음은 제 가 코드 를 써 서 여러분 께 보 여 드 리 겠 습 니 다.

public class IteratorClass {
  public Iterator<String> iterator(){
   return new Itr();
  }
  private class Itr implements Iterator<String>{
    protected String[] words=("Hello Java").split(" ");
    private int index=0;
    public boolean hasNext() {
      return index<words.length;
    }
    public String next() {
      return words[index++];
    }
    public void remove() {
    }
  }
}
Iterator iterators=new IteratorClass().iterator();
    for (Iterator it=iterator;iterators.hasNext();) {
      System.out.println(iterators.next());
    }
    while (iterators.hasNext()){
      System.out.println(iterators.next());
    }
이 를 통 해 알 수 있 듯 이 foreach 순환 은 최종 적 으로 for(Iterator it=iterator;iterators.hasNext();)jdk 가 숨 겨 줬 을 뿐 볼 수가 없어 요.다음은 List 삭제 에 관 한 문 제 를 분석 하 겠 습 니 다.우 리 는 대부분 for 순환 이나 foreach 순환 을 사용 하여 삭 제 했 을 것 입 니 다.그러나 결 과 는 분명히 오류 가 발생 할 수 있 습 니 다.그러면 지금 우 리 는 왜 오류 가 발생 했 는 지 분석 합 시다.
1:반복 삭제 사용(오류 분석 발생)


2:foreach 순환 삭제(오류 분석)
위 에서 우 리 는 foreach 가 최종 적 으로 Iterator 로 바 뀔 것 이라는 것 을 알 게 되 었 기 때문에 먼저 next 를 통 해 요 소 를 얻 을 것 입 니 다.우 리 는 코드 를 봅 니 다.


for 순환 을 보고 그 코드 를 삭제 하 십시오.modCount 회++를 한 번 도 삭제 하지 않 았 기 때문에 두 번 째 삭제 할 때 modCount 는 증가 와 expected ModCount 가 다 르 기 때문에 요 소 를 가 져 올 수 없고 삭제 할 수 없습니다.
3:올 바른 삭제 방법
교체 기 코드 를 사용 하면 다음 과 같다.

 Iterator<String> iterator=userList.iterator();
    while (iterator.hasNext()){
      iterator.next();
      iterator.remove();
    }
iterator.next()를 꼭 추가 해 야 한 다 는 것 을 기억 하 세 요.이것 은 원본 코드 에 lastRed 가 있 기 때 문 입 니 다.이 를 통 해 마지막 요소 인지 기록 합 니 다.iterator.next()를 추가 하지 않 으 면 lastRed=-1,인증 을 삭제 할 때 이러한 코드 if(lastRet<0)throw new IllegalState Exception()이 있 습 니 다.그래서 이상 을 던 지 는 거 야.
7:Collections 와 Arrays
자주 사용 하 는 Collections.addAll 과 Arrays.asList 2 개 만 소개 합 니 다.
addAll:

asList 는 배열 을 사용 합 니 다.

최종 적 으로 Array List 로 전환 한 것 을 알 수 있다.
8:총화
1):배열 은 숫자 와 대상 을 연결 시 키 는 것 으로 명확 한 대상 을 저장 합 니 다.대상 을 조회 할 때 조회 결 과 를 변환 할 필요 가 없습니다.다 차원 일 수 있 고 기본 유형의 데 이 터 를 저장 할 수 있 지만 배열 이 생 성 되면 용량 이 바 뀌 지 않 습 니 다.그래서 배열 은 요 소 를 직접 삭제 하고 추가 할 수 없습니다.
2):Collection 은 단일 한 요 소 를 저장 하고 Map 은 연 결 된 값 키 를 저장 합 니 다.자바 범 형 이 있 으 면 용기 저장 대상 유형 을 지정 할 수 있 습 니 다.잘못된 유형의 대상 을 용기 에 넣 지 않 고 요 소 를 취 할 때 도 전환 할 필요 가 없습니다.그리고 컬 렉 션 과 맵 모두 자동 으로 사 이 즈 를 조정 할 수 있 습 니 다.용 기 는 기본 유형 을 가지 고 있 으 면 안 된다.
3):배열 처럼 List 도 디지털 솔 루 션 과 대상 의 관 계 를 구축 하기 때문에 배열 과 List 는 모두 정렬 된 용기 이 고 List 는 자동 으로 확장 할 수 있다.
4):무 작위 접근 이 필요 하 다 면 ArrayList 를 사용 하고 중간 에 자주 삽입 하고 삭제 하려 면 LinkedList 를 사용 해 야 합 니 다.
5):각종 Queue 와 Stack 은 LinkedList 가 지원 합 니 다.
6):맵 은 대상(숫자 가 아 닌)을 대상 과 연결 시 키 는 디자인 입 니 다.HashMap 은 빠 른 접근 에 사 용 됩 니 다.TreeMap 유지 키 는 항상 정렬 상태 이기 때문에 HashMap 보다 빠 르 지 않 습 니 다.LinkedHashMap 은 요소 삽입 순 서 를 유지 하지만 해시 를 통 해 빠 른 접근 능력 을 제공 합 니 다.
7):Set 는 중 복 된 요 소 를 받 아들 이지 않 습 니 다.HashSet 은 가장 빠 른 접근 능력 을 제공 합 니 다.TreeSet 은 요소 정렬 상 태 를 유지 하고 LinkedHashSet 는 요 소 를 삽입 순서 로 저장 합 니 다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기