Iterador iterador vs 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
⭕
Iterator
Objetos são chamados de iteradores (um padrão de design) e são usados principalmente para percorrer os elementos em umaCollection
coleção .
⭕ O
GOF
padrão iterador é definido como: fornecer uma maneira de acessarcontainer
cada 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
Collection
interface herda ajava.lang.Iterable
interface, e a interface possui umiterator()
método, então todasCollection
as classes de coleção que implementam a interface possuem umiterator()
método para retornar um objeto que implementa aIterator
interface .
⭕
Iterator
é usado apenas para percorrer a coleção eIterator
não fornece a capacidade de hospedar objetos por si só. Se umIterator
objeto , 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
Nota: O teste
it.next()
deve ser chamado antes de chamar o métodoit.hasNext()
. Se não for chamado e o próximo registro for inválido, uma chamada diretait.next()
lançaráNoSuchElementException
uma 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,iterator
o ponteiro executará a posição marcada por ① na figura abaixo e, em seguida, executará aiterator.hasNext()
instrução. Neste momento, ele julgará seiterator
há um elemento na próxima posição (ou seja, ②) apontada pelo ponteiro, e se sim, retornetrue
, Caso contrário, retornefalse
. Quando otrue
resultado for , execute aiterator.next()
instruçãoiterator
para baixo, o ponteiro neste momento é movido para baixo e o elemento na posição definida apontada pelo ponteiro movido é retornado.
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
⭕
Iterator
Você pode excluir os elementos da coleção, mas é um método de passar o objeto iterador durante o processo de travessiaremove
, não um método do objeto de coleçãoremove
.
⭕ Se o método não foi chamado
next()
ou onext()
método o método foi chamado, uma exceção será relatada se o método for chamadoremove
novamente .remove
IllegalStateException
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.0
Fornece acesso de iteração deforeach
loopCollection
e arrays.
⭕ A operação de travessia não precisa obter
Collection
o comprimento do array ou acessar os elementos usando o índice.
⭕ A chamada subjacente para percorrer a coleção
Iterator
conclui a operação.
⭕
foreach
também pode ser usado para percorrer uma matriz.
2. Análise gramatical
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
}
}