[예약 (루프 반복기 사이의 차이 대뿐만 아니라 상세한) 자바 반복자

자바 반복자 (반복자의 차이와 자전거에 대한 설명뿐만 아니라)

상호 학습을 논의하기 위해 유용 환영 찾기 ~ [팔로우]

  • 에서 재판 https://blog.csdn.net/Jae_Wang/article/details/80526216

    머리말

  • 반복자 상세히 볼 수있는 패턴, 디자인 패턴의 데이터 구조는 객체 분리 순회 행동 종류의 시퀀스, 즉, 우리가 어떤 시퀀스의 기본 구조에 대한 상관 없어, 이송 할되도록 할 수있다. 그냥 객체의 내부를 통과 할 수 반복자를 사용하여,이 개체를 얻을
  • 의 Iterable 이 인터페이스의 구현은 반복이 반복입니다 지원하는 개체의 컬렉션입니다. 이 작업은 사용 foreach는 달성 할 수 있습니다 ~
  • 반복자 반복자이 반복 반복자 인터페이스 사양 방법, 구체적으로는, 객체의 반복 메커니즘을 제공한다.
//Iterable JDK源码
//可以通过成员内部类,方法内部类,甚至匿名内部类去实现Iterator

public interface Iterable<T>
{

    Iterator<T> iterator();
  • 반복 가능한) (기본 방법 foreach 문이
  • 반복자 인터페이스 : hasNext가, 다음, 제거 거의 사용되지 제거 : 세 가지 방법이 포함되어 있습니다.

public interface Iterator<E> {


    boolean hasNext();    //每次next之前,先调用此方法探测是否迭代到终点

    E next();            //返回当前迭代元素 ,同时,迭代游标后移


     /*删除最近一次已近迭代出出去的那个元素。
     只有当next执行完后,才能调用remove函数。
     比如你要删除第一个元素,不能直接调用 remove()   而要先next一下( );
     在没有先调用next 就调用remove方法是会抛出异常的。
     这个和MySQL中的ResultSet很类似
    */
    void remove()
    {
        throw new UnsupportedOperationException("remove");
    }

노트

  • 요소 중 반복 원본 요소의 사본들의 컬렉션이다.
  • 객체 참조의 본질이 아닌 객체 자체 컬렉션에 자바 요소를 저장합니다.
  • 개체의 반복은 결과 나 참고 문헌의 사본에 의해 참조됩니다. 그래서 당신은 요소의 집합 변수 유형 저장하면, 당신은 요소를 반복하여 컬렉션의 원본 개체를 수정할 수 있습니다.
import java.util.ArrayList;
import java.util.Iterator;

public class test {
    public static void main(String[] args) {
        ArrayList<Person> array = new ArrayList<Person>();

        Person p1 = new Person("Tom1");
        Person p2 = new Person("Tom2");
        Person p3 = new Person("Tom3");
        Person p4 = new Person("Tom4");

        array.add(p1);
        array.add(p2);
        array.add(p3);
        array.add(p4);

        Iterator<Person> iterator = array.iterator();

        for (Person pp : array){
            System.out.println(pp.getName());
        }

        System.out.println("\r\n" + "-----利用Lambda表达式的foreach-----" + "\r\n");
        array.forEach(obj -> System.out.println(obj.getName()));


        System.out.println("\r\n" + "-----利用for循环-----" + "\r\n");
        for(Person p : array){
            p.setName("wang");
        }

        while(iterator.hasNext()){
            System.out.println(iterator.next().getName()); //输出的是wang,而不是tom
        }



    }
}

지도 탐색은 동일합니다 -

public static void main(String[] args) {
        Map map = new HashMap();
        for(int i = 0; i < 10; i ++){
            map.put(i, String.valueOf("map" + i));
        }
        Iterator iterMap = map.entrySet().iterator();
        while(iterMap.hasNext()){
            Map.Entry strMap = (Map.Entry)iterMap.next();
            System.out.println("key为:" + strMap.getKey() +
                    ", value为:" + strMap.getValue());
        }
    }

컬렉션의 반복자 액세스 컬렉션의 요소, 요소의 컬렉션을 변경할 수없는 경우 다음 () 메소드가 리턴 컬렉션 캔을 통해 Iterator를 제거 마지막을 삭제 만 () 메소드 (다중 스레드를 수정). 이 ModificationException에 예외를 이끌 것, 그 르파 메커니즘입니다

//创建集合,添加元素和上述一样      
        Iterator<Person> iterator = array.iterator();

      while(iterator.hasNext()){
         String name = iterator.next().getName();
         System.out.println(name);
         if(name.equals("Tom3")){
             //array.remove(name);  不推荐这种方式
             iterator.remove();
         }
      }

반복자 및 제네릭 :

  • 클래스의 세트에 대한 반복자 구현 클래스는, 이러한 Iterator 객체를 반환 할 수 있습니다. 그것은 모든 클래스에 적용 할 수 있습니다.
  • 컬렉션 클래스 (목록 및 설정 등) 개체의 유형에로드 할 수 있기 때문에, 컬렉션에서 제거 할 때 강제로 변환 할 필요의 시간 Object 유형의 불확실, 그것은 매우 번잡하고, 제네릭을 사용, 그것은 전진하는 것입니다 이 변환 표시 형식없이 직접 사용할 수 있도록 컬렉션의 유형을 마운트 하시겠습니까 컬렉션을 말한다. 매우 편리합니다.

    foreach 문 및 반복자 관계 :

  • 세트의 각 요소에 대한 비율을 고려하지 않고, 일련의 세트의 각 처리에 사용된다. 그것은 간단한 Iterator를 확인하는 것입니다. 그러나 차이는 변화가 원래의 콜렉션 제거,주기에서 오류가 발생으로 이어질 것입니다 컬렉션을 제거 할 수있는 호출이지만, 반복자의 remove 메소드를 사용한다 때 삭제.

    루프를 사용하거나 반복자 대비를 반복자

  • 빠른 랜덤 액세스를 이용 ArrayList와, 상기 루프 GET () 메소드, 즉 랜덤 액세스 방식을 사용하므로 더 빠른 사이클에서 ArrayList와
  • LinkedList의이 순차 액세스가 비교적 빠른 다음 반복기 () 메소드에서 순차 액세스를 사용하는 방법, 즉, LinkedList의 정도로 빠르게 반복기의 사용을 사용
  • 뷰의 데이터 구조의 관점에서, 루프 구조의 액세스 시퀀스 적합 첨자 빠르게 지정된 요소를 얻을 수있다. 반복자를 사슬 구조를 액세스하기 위해, () (다음) 및 프레하여 반복기에서 찾을 수 있기 때문이다. 액세스 할 수없는 주문 모음.
  • 반복자 한번 더 이상 사용 컬렉션의 요소를 탐색하는 경우 반복자 사용의 장점은, (것이면 인터페이스 java.lang.Iterable 구현 됨) 내부 구현 클래스에 상관없이, 컬렉션의 요소가 통과하는 것과 동일한 방식으로 이용 될 수 없다 목록 스위치가 데이터를 구성하는 설정하려면 요소를 통과 코드를 변경하지 않는, 반복 사용하는 경우,이 컬렉션 알고리즘의 모든 따라 조정되어야했던 것을 반복, 질서 목록, 설정 장애, 다른 구조 때문에, 해당 액세스 알고리즘은 동일하지 않다. (정지 점 순회 도시하고 컬렉션 자체가 분리)

추천

출처www.cnblogs.com/cloud-ken/p/11303084.html