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

来源:互联网 发布:js split数组 编辑:程序博客网 时间:2024/06/16 07:58
我在博客上发表一些我的反编译学习心得,希望对大家能有帮助。这一章学习基本的迭代器Iterator基本使用和反编译smali后迭代器的查看

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

//第一个中使用for-eachIterator<对象> <对象名> = <方法返回的一个对象列表>;for(<对象> <对象名> : <对象列表>) {    [具体处理代码]}//第二种使用whileIterator<对象> <对象名> = <方法返回的一个对象列表>;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指令控制
0 0
原创粉丝点击