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
- Android学习心得(7) --- 迭代器Iterator反编译smali分析
- Android学习心得(6) --- smali语法学习
- Android学习心得(4) --- MAC下smali文件编写与运行
- android反编译-smali语法
- Android 反编译 -smali语法
- android反编译-smali语法
- android 反编译smali 学习
- Android 反编译 -smali语法
- Android 反编译 -smali语法
- android反编译-smali语法
- android反编译-smali语法
- android反编译-smali语法
- Android 反编译 -smali语法
- Android 反编译 -smali语法
- Android 反编译 -smali语法
- Android 反编译 -smali语法
- Android学习心得(10) --- MAC下Android反编译(2)
- Android学习心得(11) --- MAC下Android反编译(3)
- Core Animation 编程指南
- 欢迎使用CSDN-markdown编辑器
- 如何创建Android 4.4.2-API level 19 的模拟器
- javascript浮点型数据操作时的注意事项
- Linux 常用命令总结
- Android学习心得(7) --- 迭代器Iterator反编译smali分析
- 直方图规定化(直方图匹配)
- iOS汉字识别改进算法
- 浅析分时系统和实时系统
- Eclipse怎么修改文档注释样式
- win32 单选标记的菜单
- JDBC连接MySQL数据库
- App应用上传到appStore的几种状态
- SPFA算法——单源最短路径