Iterador Java-Iterator e loop foreach



prefácio

Este blogueiro usará a CSDN para registrar a experiência e o conhecimento adquirido e aprendido no caminho do desenvolvimento e aprendizado de software. Os amigos interessados ​​podem seguir o blogueiro!
Talvez uma pessoa caminhando sozinha possa ir muito rápido, mas um grupo de pessoas caminhando juntas pode ir mais longe! Vamos aprender uns com os outros no caminho do crescimento, bem-vindo a prestar atenção!

1. Interface do iterador

1. Iterar sobre os elementos da coleção usando a interface Iterator

IteratorObjetos são chamados de iteradores (um padrão de design) e são usados ​​principalmente para percorrer os elementos em uma Collectioncoleção .

⭕ O GOFpadrão iterador é definido como: fornecer uma maneira de acessar containercada elemento em um objeto container ( ) sem expor os detalhes internos do objeto. O padrão do iterador é para contêineres. Semelhante a "condutor no ônibus", "aeromoça no trem", "aeromoça".

⭕A Collectioninterface herda a java.lang.Iterableinterface, e a interface possui um iterator()método, então todas Collectionas classes de coleção que implementam a interface possuem um iterator()método para retornar um objeto que implementa a Iteratorinterface .

Iteratoré usado apenas para percorrer a coleção e Iteratornão fornece a capacidade de hospedar objetos por si só. Se um Iteratorobjeto , deve haver uma coleção iterada.

⭕O objeto de coleção iterator()obtém um novo objeto iterador toda vez que o método é chamado, e o cursor padrão está antes do primeiro elemento da coleção.

2. Métodos da interface do Iterador

insira a descrição da imagem aqui

Nota: O teste it.next()deve ser chamado antes de chamar o método it.hasNext(). Se não for chamado e o próximo registro for inválido, uma chamada direta it.next()lançará NoSuchElementExceptionuma exceção.

3. Princípio de execução do iterador

3.1 Demonstração do Código

//hasNext():判断是否还有下一个元素
while(iterator.hasNext()){
     
     
//next():①指针下移 ②将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}

3.2 Análise do processo de execução de código

Ao executar a Iterator iterator = coll.iterator();instrução, iteratoro ponteiro executará a posição marcada por ① na figura abaixo e, em seguida, executará a iterator.hasNext()instrução. Neste momento, ele julgará se iteratorhá um elemento na próxima posição (ou seja, ②) apontada pelo ponteiro, e se sim, retorne true, Caso contrário, retorne false. Quando o trueresultado for , execute a iterator.next()instrução iteratorpara baixo, o ponteiro neste momento é movido para baixo e o elemento na posição definida apontada pelo ponteiro movido é retornado.

insira a descrição da imagem aqui

4. Método remove() da interface do iterador

4.1 Demonstração do Código

Iterator iter = coll.iterator();//回到起点
while(iter.hasNext()){
     
     
Object obj = iter.next();
if(obj.equals("Tom")){
     
     
iter.remove();
} }

4.2 Atenção

IteratorVocê pode excluir os elementos da coleção, mas é um método de passar o objeto iterador durante o processo de travessia remove, não um método do objeto de coleção remove.

⭕ Se o método não foi chamado next()ou o next()método o método foi chamado, uma exceção será relatada se o método for chamado removenovamente .removeIllegalStateException

5. Demonstração do código

    @Test
    public void test1(){
     
     
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        Iterator iterator = coll.iterator();
        //方式一:
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        //报异常:NoSuchElementException
//        System.out.println(iterator.next());

        //方式二:不推荐
//        for(int i = 0;i < coll.size();i++){
     
     
//            System.out.println(iterator.next());
//        }

        //方式三:推荐
        hasNext():判断是否还有下一个元素
        while(iterator.hasNext()){
     
     
            //next():①指针下移 ②将下移以后集合位置上的元素返回
            System.out.println(iterator.next());
        }

    }
   @Test
    public void test2(){
     
     

        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        //错误方式一:
//        Iterator iterator = coll.iterator();
//        while((iterator.next()) != null){
     
     
//            System.out.println(iterator.next());
//        }

        //错误方式二:
        //集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
        while (coll.iterator().hasNext()){
     
     
            System.out.println(coll.iterator().next());
        }


    }

    //测试Iterator中的remove()
    //如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,
    // 再调用remove都会报IllegalStateException。
 @Test
    public void test3(){
     
     
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        //删除集合中"Tom"
        Iterator iterator = coll.iterator();
        while (iterator.hasNext()){
     
     
//            iterator.remove();
            Object obj = iterator.next();
            if("Tom".equals(obj)){
     
     
                iterator.remove();
//                iterator.remove();
            }

        }
        //遍历集合
        iterator = coll.iterator();
        while (iterator.hasNext()){
     
     
            System.out.println(iterator.next());
        }
    }

2. Loop Foreach

1. Visão Geral

Java 5.0Fornece acesso de iteração de foreachloop Collectione arrays.

⭕ A operação de travessia não precisa obter Collectiono comprimento do array ou acessar os elementos usando o índice.

⭕ A chamada subjacente para percorrer a coleção Iteratorconclui a operação.

foreachtambém pode ser usado para percorrer uma matriz.

2. Análise gramatical

insira a descrição da imagem aqui

3. Demonstração do código

    @Test
    public void test1(){
     
     
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        //for(集合元素的类型 局部变量 : 集合对象)
        //内部仍然调用了迭代器。
        for(Object obj : coll){
     
     
            System.out.println(obj);
        }
        //123
        //456
        //Person@621be5d1
        //Tom
        //false
    }
 @Test
    public void test2(){
     
     
        int[] arr = new int[]{
     
     1,2,3,4,5,6};
        //for(数组元素的类型 局部变量 : 数组对象)
        for(int i : arr){
     
     
            System.out.println(i);
        }
        //1
        //2
        //3
        //4
        //5
        //6
    }

4. Perguntas propensas a erros

public class test {
     
     
    public static void main(String[] args) {
     
     
        String[] str = new String[5];
        for (String myStr : str) {
     
     
                myStr = "小老师ir";
                System.out.println(myStr);
        }
        //小老师ir
        //小老师ir
        //小老师ir
        //小老师ir
        //小老师ir
        for (int i = 0; i < str.length; i++) {
     
     
                System.out.println(str[i]);
        }
        //null
        //null
        //null
        //null
        //null
    }
}

Acho que você gosta

Origin blog.csdn.net/weixin_52533007/article/details/124310033
Recomendado
Clasificación