用for循环foreach遍历数组详解1-50,如果遇到7的倍数,则跳过,foreach遍历数组详解下一个?

许多Android应用开发者都有着丰富的Java开发经验。自从1995年问世以来,Java已经成为一种非常流行的编程语言。虽然一些调查显示,在与其他语言(比如Objective-C或C#)的竞争中,Java已光芒不再,但它们还是不约而同地把Java排为第一流行的语言。当然,随着移动设备的销量超过个人电脑,以及Android平台的成功(2011年12月平均每天激活70万部),Java在今天的市场上扮演着比以往更重要的角色。 移动应用与PC应用在开发上有着明显的差异。如今的便携式设备已经很强大了,但在性能方面还是落后于个人电脑。例如,一些基准测试显示,四核Intel Core i7处理器的运行速度大约是三星Galaxy Tab puteRecursively的Dalvik字节码的可读格式 002548: |[002548] goto 0011 // -0002 在“|”左边的本地代码中,除了第一行(用于显示方法名),每行冒号右边是一个或多个16位的字节码单元 ,冒号左边的数字指定了它们在文件中的绝对位置。“|”右边的可读格式中,冒号左边是绝对位置转换为方法内的相对位置或标签,冒号右边是操作码助记符及后面不定个数的参数。例如,地址0x00255a的两字节码组合翻译为if-le v4, v2, 0012 // +0011,意思是说“如果虚拟寄存器v4的值小于等于虚拟寄存器v2的值,就跳转到标签0x0012,相当于跳过17(十六进制的11)个字节码单元”。术语“虚拟寄存器”是指实际上非真实的硬件寄存器,也就是Dalvik虚拟机使用的寄存器。 通常情况下,你不必看应用的字节码。在平台是Android 新实现了用了166毫秒,改进相当大(快了约100毫秒)。有人会争论说这两种实现对于大多数应用来说都是可以接受的,因为同时这么快速地插入这么多行很少见。事实上,大多数应用通常会在某一时刻访问很多行,这可能是在响应一些用户操作。最重要的一点是,该数据库是在内存中,而不是保存到持久存储(SD卡或内部闪存)上的。在数据库工作时,大量的时间花费在访问持久性存储上(读/写),这比访问易失性记忆体慢得多。通过测量内部持久存储上的数据库的操作,可以确定单个事务的性能。建立在持久存储上的数据库,如代码清单1-24所示。 当数据库在持久存储,而不是在内存中时,调用populateWithCompileStatement需要花34秒的时间,每行(52毫秒),而调用populateWithCompileStatementOneTransaction时间不到200毫秒。无需多言,一次性事务是解决这类问题的较好办法。这些数据显然取决于要用的存储类型,外部SD卡上存储的数据库会更慢,更应该采用一次性事务。 我们可以用限制数据库访问的方式来加快查询速度,尤其是对存储中的数据库。数据库查询仅会返回一个Cursor(游标)对象,然后用它来遍历结果。代码清单1-25 给出了两种方法来遍历所有的行。第一种方法是创建Cursor获取数据库中的两列数据,而第二种方法创建的Cursor只获取第一列。 代码清单1-25 遍历所有的行 public void iterateBothColumns 和预想的一样,因为没有从第二列读取数据,第二种方法快了不少,两方法分别用时61毫秒和23毫秒(使用多个事务时)。迭代所有行时,将所有行作为一个事务处理会更快,这种情况下iterateBothColumns和iterateFirstColumn各用时11毫秒和7毫秒。你可以看到,只读取需要的数据才是上上之选。调用查询时选择正确的参数,可以使性能有可观的提升。如果只需要一定数量的行,指定调用查询的限制参数,则可以进一步减少数据库的访问时间。 提示 考虑使用SQLite的FTS(全文检索)扩展,它支持更多高级搜索特性(使用索引)。参阅获取更多信息。 1.8 总结 几年前,Java由于性能问题而广受诟病,但现在情况已大有改观。每次发布新版本Android时,Dalvik虚拟机(包括它的JIT编译器)的性能都会有所提升。代码可以编译为本地代码,从而利用最新的CPU架构,而不必重新编译。虽然实现很重要,但最重要的还是慎选数据结构和算法。好算法可以弥补差的实现,甚至不需要优化就可以使应用流畅运行;而坏算法无论你在实现上花费多少精力,其结果还是会很糟糕。 最后,不要牺牲响应能力。这可能会加大应用开发的难度,但响应顺畅是应用成功的关键。

我要回帖

更多关于 java数组遍历 的文章

 

随机推荐