자바 집합 프레임 워 크 분석 (3) - List 집합 ArrayList 인 스 턴 스 와 Iterator 교체 기 소스 코드 분석

5043 단어 자바프레임
이전의 Array List 분석 을 계속 하고 소스 코드 를 분석 한 후에 우 리 는 약간의 인 스 턴 스 를 실현 하여 Array List 에서 자주 사용 하 는 API 의 용법 을 살 펴 보 겠 습 니 다. 먼저 코드 를 올 리 는 것 은 말 할 필요 도 없습니다.
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 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 () 방법 으로 집합 을 조작 할 수 있 습 니 다.
 
 
 
 

좋은 웹페이지 즐겨찾기