Android学习心得(7) --- 迭代器Iterator反编译smali分析

我在博客上发表一些我的反编译学习心得,希望对大家能有帮助。
这一章学习基本的迭代器Iterator基本使用和反编译smali后迭代器的查看

1、常见的两种迭代器代码

//第一个中使用for-each
Iterator<对象> <对象名> = <方法返回的一个对象列表>;
for(<对象> <对象名> : <对象列表>) {
    [具体处理代码]
}

//第二种使用while
Iterator<对象> <对象名> = <方法返回的一个对象列表>;
while(<对象列表>.hasNext()) {
    <对象> <对象名> = <对象列表>.next();
    [具体处理代码]
}

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素,如果仍有元素可以迭代,则返回 true。
(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

我们常用的实现了该接口的子接口有:

Collection<E>, Deque<E>, List<E>, Queue<E>, Set<E> 等.
该接口的iterator()方法返回一个标准的Iterator实现。

2、现在从例子来学习

//第一个简单的for-each例子
import java.util.ArrayList;
import java.util.List;

public class TestIterator {
    public static void main(String []args) {
        List<String> l = new ArrayList<String>();
        l.add("aa");
        l.add("bb"); 
        l.add("cc"); 
        for (String s:l) {    
            System.out.println(s);
        }
    }
}
这个程序很简单,创建一个List<String>的迭代器,然后添加3个字符串,最后通过for-each显示出来。
我们需要把TestIterator.java编译成smali文件才能进行查看反编译代码。
如何进行请查看  Android学习心得(4) --- MAC下smali文件编写与运行

Android学习心得(4) --- MAC下smali文件编写与运行

生成的TestIterator.smali文件中处理迭代器的主要代码如下:
//迭代循环开始
:goto_18
    //开始迭代
    invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z
    move-result v0
    //如果为空,则跳到cond_2a
    if-eqz v0, :cond_2a 
    //循环每一项
    invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;
    move-result-object v0
    check-cast v0, Ljava/lang/String;
    .line 12
    sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;
    invoke-virtual {v2, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
    goto :goto_18
    .line 14
    :cond_2a

//第二个简单的while例子
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestIterator {
    public static void main(String []args) {
        List<String> l = new ArrayList<String>();
        l.add("aa");
        l.add("bb"); 
        l.add("cc"); 
        Iterator iter = l.iterator(); 
        while (iter.hasNext()) { 
            String s = (String) iter.next();
            System.out.println(s);
        }
    }
}
  :goto_18
    invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z
    move-result v0
    if-eqz v0, :cond_2a
    .line 13
    invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;
    move-result-object v0
    check-cast v0, Ljava/lang/String;
    .line 14
    sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;
    invoke-virtual {v2, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
    goto :goto_18
    .line 16
    :cond_2a
基本上while循环和for-each基本相似。
迭代循环:
       1、使用hasNext()方法检测循环条件
       2、使用next()方法获得单个对象
       3、循环中用goto指令控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值