10种java性能优化方案
Java千万级别数据处理与优化

Java千万级别数据处理与优化随着互联网的发展,数据规模异常的庞大。
对于Java开发人员来说,面对这种情况,我们需要从性能和优化的角度思考,从而使我们的程序在处理海量数据时更有效率、更加可靠。
一、数据处理1. 数据读取优化数据读取是数据处理的第一步,良好的数据读取优化可以最大限度地提高程序的效率。
在数据读取方面,我们需要注重以下几个方面的优化:(1)缓存读取:对于内存中需要反复读取的数据,我们应该缓存读取,避免多次访问磁盘带来的性能损耗。
(2)文件切割:对于大文件的读取,我们可以将其切割成多个小文件,以便于多线程同时读取,并且有效减少了每个线程读取文件大小的开销。
(3)使用BufferedInputStream和BufferedReader:Java中提供了BufferedInputStream和BufferedReader这两种缓存读取的方式,可以有效地提高文件读取的效率。
2. 数据存储优化在面对千万级别的数据时,数据的存储也是我们需要优化的重要环节。
在数据存储方面,我们需要注重以下几个方面的优化:(1)使用内存存储:对于频繁读写的数据,我们应该尽量使用内存存储,避免频繁的磁盘读写,从而提高程序效率。
(2)使用NoSQL数据库:对于大规模的数据存储,我们可以使用NoSQL数据库来代替传统的关系型数据库,NoSQL数据库对分布式存储的支持更加完善,可以提高数据存储的效率。
(3)批量操作:在实际开发中,我们应该尽量采用批量操作的方式进行数据存储,这样可以有效提高数据处理的效率。
二、数据处理算法1. 分治算法分治算法是一种非常常见的算法,可以用于解决很多常见的数据处理问题。
在数据分析处理过程中,分治算法可以用来将庞大的数据集划分成多个小数据集,然后并行处理每个小数据集,最后合并结果。
通过这种方法,可以有效提高程序的处理效率。
2. MapReduce算法MapReduce算法是一种分布式数据处理算法,可以对千万级别的数据进行优化。
《Java性能调优指南》

《Java性能调优指南》随着互联网的飞速发展,Java作为一种重要的编程语言,被越来越广泛地应用于各个领域。
但是,Java程序的性能问题也随之出现。
如何调优Java 程序的性能,成为了每个开发人员需要解决的难题。
本文将为大家介绍Java性能调优的指南。
一、JVM参数设置JVM(Java虚拟机)参数设置是Java性能调优的关键。
JVM有众多的参数,不同的参数设置会对Java程序的性能产生不同的影响。
常用的JVM参数设置包括以下几个方面:1. 内存设置内存是Java程序的一大瓶颈。
如果内存设置不合理,会导致Java程序频繁地进行垃圾回收,造成程序的延迟和不稳定。
在设置内存参数时需要注意以下几点:- -Xmx: 最大堆内存,设置合理的最大堆内存大小可以减少JVM的垃圾回收次数,提高程序性能。
- -Xms: 初始堆内存,设置合理的初始堆内存大小可以加快程序启动时间,提高程序性能。
- -XX:NewRatio: 新生代与老年代的比例,如果设置得当,可以减少垃圾回收的次数。
通常新生代的大小为总堆容量的1\/3或1\/4,老年代的大小为总堆容量的2\/3或3\/4。
2. 垃圾回收设置垃圾回收是Java程序中必不可少的一部分。
合理的垃圾回收参数设置可以提高程序性能。
常用的垃圾回收参数设置包括以下几点:- -XX:+UseParallelGC: 使用并行GC,适用于多核CPU。
- -XX:+UseConcMarkSweepGC: 使用CMS GC,适用于大型Web应用程序。
- -XX:+UseG1GC: 使用G1 GC,适用于大内存应用程序。
3. JIT设置JIT(即时编译器)是Java程序中非常重要的一部分。
合理的JIT参数设置可以提高程序的性能。
常用的JIT参数设置包括以下几点:- -XX:+TieredCompilation: 启用分层编译,可以提高程序启动时间和性能。
- -XX:CompileThreshold: JIT编译阈值,设置JIT编译的最小方法调用次数,可以提高程序性能。
java开发对自己工作改善及提升方面的建议

java开发对自己工作改善及提升方面的建议作为一名Java开发人员,以下是我对自己工作改善和提升的建议:
1. 学习新技术:Java是一门不断发展的语言,持续学习新技术是必不可少的。
了解最新的Java 版本,学习新的框架和库,掌握最佳实践,可以提高代码质量和开发效率。
2. 练习算法和数据结构:算法和数据结构是计算机科学的基础,对于Java开发人员来说,熟练掌握常见的算法和数据结构,可以帮助解决复杂的问题和优化代码性能。
3. 编写可维护的代码:编写可读性好、可维护的代码是一项重要的技能。
使用有意义的命名、正确使用注释、遵循代码规范和设计模式等,可以提高代码的可读性和可维护性。
4. 强化测试能力:测试是确保代码质量的关键。
掌握单元测试、集成测试和自动化测试等相关技术,编写高质量的测试用例,可以提高软件的健壮性和稳定性。
5. 参与开源项目和社区:参与开源项目和社区可以扩展自己的知识和技能,与其他开发人员交流和合作,获得反馈和指导。
同时,这也是展示自己技术能力和增加职业网络的机会。
6. 持续优化和改进:作为一名Java开发人员,要时刻思考如何优化和改进自己的工作方式。
通过使用工具和技术来提高开发效率,关注代码质量和性能问题,不断追求卓越。
7. 提高沟通和团队合作能力:Java开发往往是团队协作的工作,良好的沟通和团队合作能力是成功的关键。
与团队成员保持良好的沟通,共享知识和经验,理解并满足业务需求,有助于项目的成功实施。
希望以上建议对你有所帮助,祝你工作顺利!。
【Java】嵌套For循环性能优化案例

【Java】嵌套For循环性能优化案例1 案例描述某⽇,在JavaEye上看到⼀道⾯试题,题⽬是这样的:请对以下的代码进⾏优化Java代码1. for (int i = 0; i < 1000; i++)2. for (int j = 0; j < 100; j++)3. for (int k = 0; k < 10; k++)4. testFunction (i, j, k);(注:为了同后⾯的内容⼀致,这⾥对原题⽬进⾏了部分修改)2 案例分析从给出的代码可知,不论如何优化,testFunction执⾏的次数都是相同的,该部分不存在优化的可能。
那么,代码的优化只能从循环变量i、j、k的实例化、初始化、⽐较、⾃增等⽅⾯的耗时上进⾏分析。
⾸先,我们先分析原题代码循环变量在实例化、初始化、⽐较、⾃增等⽅⾯的耗时情况:变量实例化(次数)初始化(次数)⽐较(次数)⾃增(次数)i1110001000j100010001000 * 1001000 * 100k1000 * 1001000 * 1001000 * 100 * 101000 * 100 * 10(注:由于单次耗时视不同机器配置⽽不同,上表相关耗时采⽤处理的次数进⾏说明)该代码的性能优化就是尽可能减少循环变量i、j、k的实例化、初始化、⽐较、⾃增的次数,同时,不能引进其它可能的运算耗时。
3 解决过程从案例分析,对于原题代码,我们提出有两种优化⽅案:3.1 优化⽅案⼀代码如下:Java代码1. for (int i = 0; i < 10; i++)2. for (int j = 0; j < 100; j++)3. for (int k = 0; k < 1000; k++)4. testFunction (k, j, i);该⽅案主要是将循环次数最少的放到外⾯,循环次数最多的放⾥⾯,这样可以最⼤程度的(注:3个不同次数的循环变量共有6种排列组合情况,此种组合为最优)减少相关循环变量的实例化次数、初始化次数、⽐较次数、⾃增次数,⽅案耗时情况如下:变量实例化(次数)初始化(次数)⽐较(次数)⾃增(次数)i111010j101010 * 10010 * 100k10 * 10010 * 10010 * 100 * 100010 * 100 * 10003.2 优化⽅案⼆代码如下:Java代码1. int i, j, k;2. for (i = 0; i < 10; i++)3. for (j = 0; j < 100; j++)4. for (k = 0; k < 1000; k++)5. testFunction (k, j, i);该⽅案在⽅案⼀的基础上,将循环变量的实例化放到循环外,这样可以进⼀步减少相关循环变量的实例化次数,⽅案耗时情况如下:变量实例化(次数)初始化(次数)⽐较(次数)⾃增(次数)i111010j11010 * 10010 * 100k110 * 10010 * 100 * 100010 * 100 * 10004 解决结果那么,提出的优化⽅案是否如我们分析的那样有了性能上的提升了呢?我们编写⼀些测试代码进⾏验证,数据更能说明我们的优化效果。
java加快流处理速度的方法

java加快流处理速度的方法Java是一种通用、面向对象的编程语言,广泛应用于各个领域。
对于需要处理大量数据的应用程序,加快Java流处理速度是提升整体性能的关键。
以下是加快Java流处理速度的几种方法:1. 使用缓冲区(Buffering):通过使用缓冲区,可以减少磁盘或网络读写操作的次数,从而提高流处理速度。
在Java中,可以通过使用BufferedReader和BufferedWriter类来实现读写缓冲区的功能。
示例代码:```javaBufferedReader reader = new BufferedReader(newFileReader("input.txt"));BufferedWriter writer = new BufferedWriter(newFileWriter("output.txt"));String line;while ((line = reader.readLine()) != null) {// 处理数据writer.write(line);}reader.close();writer.close();```2. 使用并行流(Parallel Streams):Java 8引入了并行流的概念,允许将大数据集分成多个部分并行处理,提高流处理速度。
通过使用stream()方法将流转换为并行流,可以利用多核处理器的能力来加速处理。
```javaList<String> data = Arrays.asList("a", "b", "c", "d", "e");data.parallelStream().forEach(System.out::println);```3. 优化循环操作:在Java中,使用for循环时,尽可能减少循环内的不必要操作,以降低性能开销。
Java中性能优化的35种方法汇总

Java中性能优化的35种⽅法汇总前⾔对程序员们来说,代码优化是⼀个很重要的课题。
可能有些⼈觉得没⽤,⼀些细⼩的地⽅有什么好修改的,改与不改对于代码的运⾏效率有什么影响呢?这个问题我是这么考虑的,就像⼤海⾥⾯的鲸鱼⼀样,它吃⼀条⼩虾⽶有⽤吗?没⽤,但是,吃的⼩虾⽶⼀多之后,鲸鱼就被喂饱了。
代码优化也是⼀样,如果项⽬着眼于尽快⽆BUG上线,那么此时可以抓⼤放⼩,代码的细节可以不精打细磨;但是如果有⾜够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,⼀个⼀个细⼩的优化点累积起来,对于代码的运⾏效率绝对是有提升的。
代码优化的⽬标是:1、减⼩代码的体积2、提⾼代码运⾏的效率代码优化细节1、尽量指定类、⽅法的final修饰符带有final修饰符的类是不可派⽣的。
在Java核⼼API中,有许多应⽤final的例⼦,例如ng.String,整个类都是final的。
为类指定final修饰符可以让类不可以被继承,为⽅法指定final修饰符可以让⽅法不可以被重写。
如果指定了⼀个类为final,则该类所有的⽅法都是final的。
Java编译器会寻找机会内联所有的final⽅法,内联对于提升Java运⾏效率作⽤重⼤,具体参见Java 运⾏期优化。
此举能够使性能平均提⾼50%。
2、尽量重⽤对象特别是String对象的使⽤,出现字符串连接时应该使⽤StringBuilder/StringBuffer代替。
由于Java虚拟机不仅要花时间⽣成对象,以后可能还需要花时间对这些对象进⾏垃圾回收和处理,因此,⽣成过多的对象将会给程序的性能带来很⼤的影响。
3、尽可能使⽤局部变量调⽤⽅法时传递的参数以及在调⽤中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。
另外,栈中创建的变量,随着⽅法的运⾏结束,这些内容就没了,不需要额外的垃圾回收。
4、及时关闭流Java编程过程中,进⾏数据库连接、I/O流操作时务必⼩⼼,在使⽤完毕后,及时关闭以释放资源。
java高并发解决方案

java高并发解决方案随着网络的快速发展和应用场景的不断扩大,高并发问题也越来越突出。
Java语言作为目前应用最广泛的语言之一,在高并发方面也有很强的应用能力。
本文将从Java高并发解决方案的相关知识出发,介绍一些解决方案和应用技巧,对读者在实际开发中解决高并发问题有所帮助。
一、什么是高并发高并发是对于计算机系统而言非常苛刻的一种情况,简单来说就是在同一时间内有大量用户并发访问同一个系统,如果系统不能应对这样的请求,就会出现各种异常、错误、崩溃等问题。
高并发是一种资源竞争,主要是因为系统中的资源(CPU、内存、硬盘I/O、网络带宽等)有限,而请求无限。
在高并发的情况下,往往需要针对这些资源进行优化,才能保证系统的稳定性和高效性。
二、 Java高并发解决方案1. 多线程技术Java作为一种优秀的多线程语言,其本身就具有天生的高并发能力。
通过合理地使用多线程技术,可以有效地提高系统的并发处理能力。
在Java中,我们可以使用Thread类和Runnable接口来创建线程,可以使用synchronized关键字来实现线程同步,从而保证线程安全。
在实际开发中,需要根据实际情况选择合适的多线程解决方案。
2. 数据库优化数据库是应用系统中常用的存储数据的方式,在高并发情况下,数据库的性能往往会成为系统的瓶颈。
为了提高数据库的性能,可以从多个方面进行优化,包括优化SQL语句、增加索引、分区表、使用缓存等。
3. 缓存技术缓存是一种可以有效提高系统性能的技术。
在高并发的情况下,使用缓存可以减轻数据库的负担,提高系统的访问速度。
常见的缓存方案包括本地缓存、分布式缓存、反向代理缓存等。
4. 分布式架构分布式架构可以将系统各个部分分别部署在不同的服务器上,通过负载均衡、集群等技术实现资源共享和数据同步,从而有效地提高系统的并发能力和稳定性。
常见的分布式架构方案包括SOA、微服务、分布式缓存等。
5. 性能测试和调优性能测试和调优是保证系统高并发能力的关键。
如何在Java中进行并发计算和分布式系统的优化设计

如何在Java中进行并发计算和分布式系统的优化设计并发计算是指多个任务在同一时间段内同时执行的计算方式。
而分布式系统是指将一个计算机系统分布在不同的物理位置上,通过网络互联,形成一个整体的计算系统。
在Java中,可以使用多线程技术来实现并发计算,同时也可以使用分布式框架来优化分布式系统的设计。
1.并发计算的优化设计:在Java中,可以通过以下几种方式来优化并发计算的设计:1.1使用线程池:线程池是一个管理线程的工具,可以重用已创建的线程,有效地管理线程的创建和销毁。
通过使用线程池,可以避免频繁地创建和销毁线程所带来的开销,并且可以控制同时执行的线程数量,避免系统资源被过度占用。
1.2使用锁机制:Java提供了synchronized关键字和Lock接口来实现锁机制,可以保证多个线程访问共享资源的互斥性,避免数据竞争和不一致性。
在多线程环境下,通过合理的锁机制设计,可以提高并发计算的效率和准确性。
1.3使用并发容器:Java提供了一系列的并发容器,如ConcurrentHashMap、ConcurrentLinkedQueue等,这些容器在多线程环境下具有较高的并发性能。
通过使用并发容器,可以避免手动实现线程安全的数据结构,减少错误和并发问题的发生。
1.4使用无锁算法:无锁算法是一种高效的并发计算方式,通过使用原子操作或CAS(Compare and Swap)指令来实现多个线程对共享资源的并发操作,避免了锁机制带来的性能损耗。
在Java中,可以使用Atomic类或java.util.concurrent.atomic包下的原子类来实现无锁算法。
1.5使用并行流和并行算法:Java 8引入了Stream API和并行流(Parallel Stream),通过将计算任务分解为多个子任务,然后并行执行,可以利用多核处理器的性能优势,提高计算速度。
同时,还可以使用Java 8提供的并行算法,如并行排序、并行归约等,进一步提高并发计算的效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩展程序性能的技巧。
最近“全网域(Web Scale)”一词被炒得火热,人们也正在通过扩展他们的应用程序架构来使他们的系统变得更加“全网域”。
但是究竟什么是全网域?或者说如何确保全网域?扩展的不同方面全网域被炒作的最多的是扩展负载(Scaling load),比如支持单个用户访问的系统也可以支持10 个、100个、甚至100万个用户访问。
在理想情况下,我们的系统应该保持尽可能的“无状态化(stateless)”。
即使必须存在状态,也可以在网络的不同处理终端上转化并进行传输。
当负载成为瓶颈时候,可能就不会出现延迟。
所以对于单个请求来说,耗费50到100毫秒也是可以接受的。
这就是所谓的横向扩展(Scaling out)。
扩展在全网域优化中的表现则完全不同,比如确保成功处理一条数据的算法也可成功处理10条、100条甚至100万条数据。
无论这种度量类型是是否可行,事件复杂度(大O符号)是最佳描述。
延迟是性能扩展杀手。
你会想尽办法将所有的运算处理在同一台机器上进行。
这就是所谓的纵向扩展(Scaling up)。
如果天上能掉馅饼的话(当然这是不可能的),我们或许能把横向扩展和纵向扩展组合起来。
但是,今天我们只打算介绍下面几条提升效率的简单方法。
大O符号Java 7的ForkJoinPool和Java8 的并行数据流(parallel Stream)都对并行处理有所帮助。
当在多核处理器上部署Java程序时表现尤为明显,因所有的处理器都可以访问相同的内存。
所以,这种并行处理较之在跨网络的不同机器上进行扩展,根本的好处是几乎可以完全消除延迟。
但不要被并行处理的效果所迷惑!请谨记下面两点:∙并行处理会吃光处理器资源。
并行处理为批处理带来了极大的好处,但同时也是非同步服务器(如HTTP)的噩梦。
有很多原因可以解释,为什么在过去的几十年中我们一直在使用单线程的Servlet模型。
并行处理仅在纵向扩展时才能带来实际的好处。
∙并行处理对算法复杂度没有影响。
如果你的算法的时间复杂度为O(nlogn),让算法在c 个处理器上运行,事件复杂度仍然为O(nlogn/c),因为c 只是算法中的一个无关紧要的常量。
你节省的仅仅是时钟时间(wall-clock time),实际的算法复杂度并没有降低。
降低算法复杂度毫无疑问是改善性能最行之有效的办法。
比如对于一个HashMap 实例的lookup() 方法来说,事件复杂度O(1) 或者空间复杂度O(1) 是最快的。
但这种情况往往是不可能的,更别提轻易地实现。
如果你不能降低算法的复杂度,也可以通过找到算法中的关键点并加以改善的方法,来起到改善性能的作用。
假设我们有下面这样的算法示意图:该算法的整体时间复杂度为O(N3),如果按照单独访问顺序计算也可得出复杂度为O(N x O x P)。
但是不管怎样,在我们分析这段代码时会发现一些奇怪的场景:∙在开发环境中,通过测试数据可以看到:左分支(N->M->Heavy operation)的时间复杂度M 的值要大于右边的O 和P,所以在我们的分析器中仅仅看到了左分支。
∙在生产环境中,你的维护团队可能会通过AppDynamics、DynaTrace 或其它小工具发现,真正导致问题的罪魁祸首是右分支(N -> O -> P -> Easy operation or also N.O.P.E.)。
在没有生产数据参照的情况下,我们可能会轻易的得出要优化“高开销操作”的结论。
但我们做出的优化对交付的产品没有起到任何效果。
优化的金科玉律不外乎以下内容:∙良好的设计将会使优化变得更加容易。
∙过早的优化并不能解决多有的性能问题,但是不良的设计将会导致优化难度的增加。
理论就先谈到这里。
假设我们已经发现了问题出现在了右分支上,很有可能是因产品中的简单处理因耗费了大量的时间而失去响应(假设N、O和P 的值非常大),请注意文章中提及的左分支的时间复杂度为O(N3)。
这里所做出的努力并不能扩展,但可以为用户节省时间,将困难的性能改善推迟到后面再进行。
这里有10条改善Java性能的小建议:1、使用StringBuilderStingBuilder 应该是在我们的Java代码中默认使用的,应该避免使用+ 操作符。
或许你会对StringBuilder 的语法糖(syntax sugar)持有不同意见,比如:1 String x = "a" + args.length + "b";将会被编译为:1 2 3 4 5 6 7 8 91011 0 new ng.StringBuilder [16]3 dup4 ldc <String "a"> [18]6 invokespecial ng.StringBuilder(ng.String) [20]9 aload_0 [args]10 arraylength11 invokevirtual ng.StringBuilder.append(int) : ng.StringBuilder 14 ldc <String "b"> [27]16 invokevirtual ng.StringBuilder.append(ng.String) :ng.StringBuilder [29]19 invokevirtual ng.StringBuilder.toString() : ng.String [32] 22 astore_1 [x]但究竟发生了什么?接下来是否需要用下面的部分来对String 进行改善呢?1 2 3 4 String x = "a" + args.length + "b";if (args.length == 1)x = x + args[0];现在使用到了第二个StringBuilder,而且这个StringBuilder 不会消耗堆中额外的内存,但却给GC 带来了压力。
1 2 3 4 5 6 StringBuilder x = new StringBuilder("a"); x.append(args.length);x.append("b");if (args.length == 1);x.append(args[0]);小结在上面的样例中,如果你是依靠Java编译器来隐式生成实例的话,那么编译的效果几乎和是否使用了StringBuilder 实例毫无关系。
请记住:在N.O.P.E 分支中,每次CPU的循环的时间到白白的耗费在GC或者为StringBuilder 分配默认空间上了,我们是在浪费N x O x P 时间。
一般来说,使用StringBuilder 的效果要优于使用+ 操作符。
如果可能的话请在需要跨多个方法传递引用的情况下选择StringBuilder,因为String 要消耗额外的资源。
JOOQ在生成复杂的SQL语句便使用了这样的方式。
在整个抽象语法树(AST Abstract Syntax Tree)SQL传递过程中仅使用了一个StringBuilder 。
更加悲剧的是,如果你仍在使用StringBuffer的话,那么用StringBuilder 代替 StringBuffer吧,毕竟需要同步字符串的情况真的不多。
2、避免使用正则表达式正则表达式给人的印象是快捷简便。
但是在N.O.P.E 分支中使用正则表达式将是最糟糕的决定。
如果万不得已非要在计算密集型代码中使用正则表达式的话,至少要将 Pattern缓存下来,避免反复编译Pattern。
1 static final Pattern HEAVY_REGEX =2 pile("(((X)*Y)*Z)*");如果仅使用到了如下这样简单的正则表达式的话:1 String[] parts = ipAddress.split("\\.");这是最好还是用普通的char[] 数组或者是基于索引的操作。
比如下面这段可读性比较差的代码其实起到了相同的作用。
1 2 3 4 5 6 7 8 9101112 int length = ipAddress.length();int offset = 0;int part = 0;for (int i = 0; i < length; i++) {if (i == length - 1 ||ipAddress.charAt(i + 1) == '.') {parts[part] =ipAddress.substring(offset, i + 1);part++;offset = i + 2;}}上面的代码同时表明了过早的优化是没有意义的。
虽然与split() 方法相比较,这段代码的可维护性比较差。
挑战:聪明的小伙伴能想出更快的算法吗?小结正则表达式是十分有用,但是在使用时也要付出代价。
尤其是在N.O.P.E 分支深处时,要不惜一切代码避免使用正则表达式。
还要小心各种使用到正则表达式的JDK字符串方法,比如String.replaceAll()或String.split()。
可以选择用比较流行的开发库,比如Apache Commons Lang来进行字符串操作。
3、不要使用iterator()方法这条建议不适用于一般的场合,仅适用于在 N.O.P.E 分支深处的场景。
尽管如此也应该有所了解。
Java 5格式的循环写法非常的方便,以至于我们可以忘记内部的循环方法,比如: 1 2for (String value : strings) {// Do something useful here2345 int cursor; int lastRet = -1; int expectedModCount = modCount; // ...也可以用下面等价的循环方式来替代上面的 for 循环,仅仅是在栈上“浪费”了区区一个整形,相当划算。
12345 int size = strings.size(); for (int i = 0; i < size; i++) { String value : strings.get(i); // Do something useful here } 如果循环中字符串的值是不怎么变化,也可用数组来实现循环。
1 2 3 for (String value : stringArray) {// Do something useful here}小结无论是从易读写的角度来说,还是从API 设计的角度来说迭代器、Iterable 接口和 foreach 循环都是非常好用的。