자바 집합 프레임 워 크 분석 (3) - List 집합 ArrayList 인 스 턴 스 와 Iterator 교체 기 소스 코드 분석
public class ArrayListDemo2 {
public static void main(String[] args) {
ArrayList<Object> al = new ArrayList<Object>();
al.add(new Person("asdf", 25));
al.add(new Person("asdf1", 32));
al.add(new Person("asd2f", 44));
al.add(new Person("asdf3", 12));
al.add(new Person("asd4f", 54));
al.add(new Person("asd4f", 54));
al = singleElement(al);
Iterator it = al.iterator();
while (it.hasNext()) {
Person p = (Person) it.next();
sop(p.getname() + "...." + p.getage());
}
// remove equals
sop(al.remove(new Person("asd2f", 44)));
}
public static ArrayList singleElement(ArrayList al) {
ArrayList<Object> newal = new ArrayList();
ListIterator it = al.listIterator();
while (it.hasNext()) {
Object obj = it.next();
// contains equals ,
if (!newal.contains(obj))
newal.add(obj);
}
return newal;
}
private static void sop(Object o) {
System.out.println(o);
}
}
class Person {
private String name;
private int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getname() {
return name;
}
public int getage() {
return age;
}
// equals
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
Person p = (Person) obj;
//
System.out.println(this.getname() + "..." + p.name);
return this.name.equals(p.name) && this.age == p.age;
}
}
이 인 스 턴 스 에서 저 는 먼저 Array List 대상 을 만 들 었 습 니 다. 집합 에 Person 대상 을 추가 한 다음 에 집합 에 여러 Person 대상 을 추가 하고 add 방법 을 추가 하 며 remove 방법 을 삭제 합 니 다. 이런 구체 적 인 방법 들 은 여러분 이 스스로 API 를 조회 할 수 있 도록 소개 하지 않 습 니 다. 주의해 야 할 것 은 요 소 를 옮 겨 다 니 려 면 Iterator 라 는 교체 기 를 사용 해 야 합 니 다.이 교체 기 는 어떻게 실현 되 었 습 니까?아니면 소스 코드 부터 분석 할 까요?
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
Iterator 는 하나의 인터페이스 로 볼 수 있 습 니 다. 그 중에서 세 가지 방법 만 있 습 니 다. (Enumeration < E > 매 거 진 클래스 로 도 가능 합 니 다. Enumeration < E > 에는 두 가지 방법 만 있 습 니 다) 옮 겨 다 닐 때 이 코드 를 알 수 있 습 니 다. (ListIterator 는 Iterator 의 강화 판 입 니 다)
ListIterator it = al.listIterator();
우 리 는 al. iterator () 를 보 았 다.iterator () 방법 다시 보기:
public Iterator
return new Itr();
}
이 방법 이 Itr 대상 으로 돌아 간 다 는 것 을 쉽게 알 수 있 습 니 다. 인 스 턴 스 코드 를 보면 우 리 는 일반적으로 hasNext () 와 next () 방법 에 의존 하면 옮 겨 다 닐 수 있다 는 것 을 알 고 있 습 니 다. 그러나 여기 서 우 리 는 Itr 대상 을 깊이 분석 하고 소스 코드 를 볼 수 있 습 니 다. 여기 서 우 리 는 소스 코드 를 세그먼트 분석 할 것 입 니 다.
private class Itr implements Iterator<E> {
int cursor = 0;
int lastRet = -1;
int expectedModCount = modCount;
}
Itr 내부 클래스 에 세 개의 int 변수 cursor 가 다음 에 next () 커서 를 호출 하거나 포인터 가 가리 키 는 위 치 를 표시 하 는 것 을 볼 수 있 습 니 다. 처음에는 0 이 고 lastRet 는 지난번 위치 입 니 다 (그래서 항상 cursor 보다 적 습 니 다).expected ModCount 는 기 대 했 던 modCount 값 을 표시 하여 옮 겨 다 니 는 과정 에서 집합 이 수정 되 었 는 지 여 부 를 판단 합 니 다.modCount 의 초기 값 은 0 입 니 다. 집합 이 수 정 될 때마다 (add, remove 등 방법 을 호출) modCount 에 1 을 추가 합 니 다.따라서 modCount 가 변 하지 않 으 면 집합 내용 이 수정 되 지 않 았 음 을 나타 낸다.
자, 알 겠 습 니 다. 이 세 가지 핵심 변 수 를 보 겠 습 니 다. 핵심 코드 를 보 겠 습 니 다.
public boolean hasNext() {
return cursor != size();
}
커서 의 값 과 집합 요소 의 개수 가 hasNext () 방법의 값 을 결정 하 는 것 을 알 고 있 습 니 다. 즉, 포인터 가 마지막 요 소 를 가리 킬 때 false 로 돌아 갑 니 다.
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
이것 은 next () 방법 입 니 다. 색인 은 cursor 의 요소 대상 이 고 cursor 와 lastRet 변 수 를 모두 수정 합 니 다.
이것 이 바로 Iterator 교체 기의 전체 절차 이기 때문에
while (it.hasNext()) {
Object obj = it.next();
// contains equals ,
if (!newal.contains(obj))
newal.add(obj);
}
이 코드 는 집합 을 옮 겨 다 니 는 과정 을 완성 할 수 있 습 니 다. 뿐만 아니 라 교체 기 는 reove (), add (), set () 방법 으로 집합 을 조작 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.