>  기사  >  Java  >  Java AbstractCollection의 제거 메소드에 대한 자세한 설명

Java AbstractCollection의 제거 메소드에 대한 자세한 설명

Y2J
Y2J원래의
2017-05-09 13:50:132047검색

이 글에서는 주로 Java 컬렉션에서 요소를 삭제하는 ArrayList 인스턴스에 대한 자세한 설명을 소개합니다. 필요한 친구는

Java 컬렉션에서 요소를 삭제하는 ArrayList 인스턴스에 대한 자세한 설명을 참조하세요. Java 컬렉션

AbstractCollection 컬렉션 클래스에는 다양한 컬렉션에 적응하기 위해 이 메서드를 사용하면 코드의 이 부분을 볼 때 빈 요소를 삭제할 수 있습니다. , 질문이 있습니다. 여기서 it.remove()를 사용하여 직접 삭제하는 이유는 무엇입니까?

public boolean remove(Object o) {
    Iterator<E> it = iterator();
    if (o==null) {
      while (it.hasNext()) {
        if (it.next()==null) {
          it.remove();
          return true;
        }
      }
    } else {
      while (it.hasNext()) {
        if (o.equals(it.next())) {
          it.remove();
          return true;
        }
      }
    }
    return false;
  }

다음으로 ArrayList를 예로 들어 설명하겠습니다. 상속 구조는 아래 그림과 같습니다. 또한 ArrayList에는 내부에 Iterator 구현 클래스가 있습니다.

테스트 코드 작성:

AbstractCollection<String> list = new ArrayList<>();
    list.add("a");
    list.add(null);
    list.add(null);

    Iterator<String> iter = list.iterator();
    while(iter.hasNext()) {
      if(iter.next() == null) {
        iter.remove();
      }
    }
    System.out.println(list);

핵심은 여전히 ​​iter.next() == null 줄입니다. next는 다음과 같습니다: 여기서

 public E next() {
      checkForComodification();
      int i = cursor;
      if (i >= size)
        throw new NoSuchElementException();
      Object[] elementData = ArrayList.this.elementData;
      if (i >= elementData.length)
        throw new ConcurrentModificationException();
      cursor = i + 1;
      return (E) elementData[lastRet = i];
    }

cusor는 순회 중에 인덱스 를 나타냅니다. next 메서드가 호출되면 cusor는 실제로 현재 요소의 다음 요소를 가리키며 lasrRet가 사용됩니다. 데이터의 현재 인덱스를 가져와 반환합니다.

remove() 메소드에서는 lastRet의 index를 통해 삭제가 이루어집니다.

  public void remove() {
      if (lastRet < 0)
        throw new IllegalStateException();
      checkForComodification();

      try {
        ArrayList.this.remove(lastRet);
        cursor = lastRet;
        lastRet = -1;
        expectedModCount = modCount;
      } catch (IndexOutOfBoundsException ex) {
        throw new ConcurrentModificationException();
      }
    }

위에 언급된 테스트 예를 사용하여 각 단계를 계산할 수 있습니다.

1. next() 메서드를 호출합니다. 커서는 요소 0을 가리키고 i에는 커서 값이 할당된 다음 커서는 i+1로 수정되어 요소 1을 가리킵니다. null은 해당 위치에서 lastRet에 0 값이 할당됩니다.
2. next() 메서드를 호출합니다. 커서는 요소 1을 가리키고 이를 i에 할당합니다. 그러면 커서는 i+1만큼 증가하여 2가 됩니다.
3. lastRet가 나타내는 요소를 삭제하고 삭제합니다. 삭제가 완료된 후 커서 포인터를 수정하고 ExpectModCount 및 modCount를 일관되게 만들어 fastfail을 방지하세요.

【관련 추천】

1. Java 무료 동영상 튜토리얼

Geek Academy Java 동영상 튜토리얼

3. JAVA 튜토리얼 매뉴얼

위 내용은 Java AbstractCollection의 제거 메소드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.