先在下面代码:
package performance; import java.util.ArrayList; import java.util.List; import java.util.Random; public class PerformanceTest { @SuppressWarnings("unchecked") public static void main(String[] args) { int num = 100*10000; List container = new ArrayList(); for(int i=0;i<num;i++) { container.add(new Random().nextInt(150)); } long start = System.currentTimeMillis();//记录开始时间 System.out.println("平均数是:"+average(container)); System.out.println("平均时间:"+(System.currentTimeMillis()-start)+"ms"); long start2 = System.currentTimeMillis();//记录开始时间 System.out.println("平均数是:"+average2(container)); System.out.println("平均时间:"+(System.currentTimeMillis()-start2)+"ms"); } //计算平均数 public static int average(List<Integer> list) { int sum = 0; for(int i=0;i<list.size();i++) { sum+=list.get(i); } return sum/list.size(); } //计算平均数 public static int average2(List<Integer> list) { int sum = 0; for(int i : list) { sum+=i; } return sum/list.size(); } }
输出结果:
平均数是:74 平均时间:23ms 平均数是:74 平均时间:38ms
question:为什么两种循环的效率相差这么多?
我是一个java菜鸟,我写代码的时候看心情的,想到写那个就写那个,以为效率都差不多,没想到。。。呜呜,菜鸟受打击了~
读了Api后才知道ArrayList实现了RandomAccess接口(随机访问呢),这是一个标志性接口,无需任何实现。
foreach方式是iterator(迭代器)的变形用法,等价于
for(Iterator<Integer> iter = list.iterator();i.hashNext;) { sum+=i.next(); }
迭代器是23种设计模式中的一种,“提供中方法访问一个容器对象的各个元素,同时无需暴露该对象的内部细节”,需要创建一个迭代器容器,然后屏蔽内部细节。但是ArrayList实现了RandomAccess接口,以表明两个对象没有关系,但迭代器缺需要判断是否有下个元素,以及下一个元素是什么等关系,这就是foreach遍历耗时的原因。同理,如果对象之间是有关系的,即是List实现类不是随机存取的,比如LinkedList类,它是一个双向链表,previous node - current node -next node ,此时,使用foreach迭代效率更高。有兴趣的可看下LinkedList的api。重构average方法:
//重构后的方法 public static int average3(List<Integer> list) { int sum = 0; if(list instanceof RandomAccess) { for(int i=0;i<list.size();i++) { sum+=list.get(i); } }else{ for(int i : list) { sum+=i; } } return sum/list.size(); }
相关推荐
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而著名。"java代码整理"可能指的是对已经编写完成的Java程序进行优化、重构或分类管理的过程。这个过程对于保持代码的整洁性、提高代码...
4. **学习编程技巧**:通过阅读手册,开发者可以学习到最佳实践和优化技巧,提升代码质量。 在实际开发中,开发者需要结合Cortex-M3的技术文档、STM32的数据手册以及开发工具,才能更好地理解和利用这些资源,进行...
它不仅涵盖了基础语法、高级特性,还深入探讨了如何编写高质量代码的方法与技巧。本书旨在帮助读者掌握优秀的编程实践,并能够在实际项目中应用这些知识,提升软件质量和开发效率。 #### 二、核心知识点概览 #####...
【代码阅读整理5】 在软件开发过程中,代码阅读是一项至关重要的技能,它涉及到对他人编写的源代码的理解、分析和评估。"代码阅读整理5"可能是某个系列教程或笔记的一部分,旨在帮助开发者提升代码理解能力,提高...
### 高质量C编程高手整理版 #### 一、概览 本文档是关于高质量C编程的指南,由林锐博士编写,版本为1.0,发布于2001年7月24日。该文档旨在帮助学习C语言的学生和开发者掌握良好的编程习惯和实践方法,提升代码质量...
总的来说,CodeMirror是一个强大且灵活的在线代码编辑器,无论是对于个人项目还是企业级应用,都能提供高质量的代码编辑体验。通过深入理解和利用其提供的功能,开发者可以创建出更加高效、易用的Web应用代码编辑...
AStyle(Artistic Style)是一款优秀的开源代码整理工具,主要用于自动格式化C、C++、C++/CLI、Objective-C、C#和Java等编程语言的源代码,使其遵循特定的编码风格。这款工具在编程社区中广受欢迎,因为它可以帮助...
- **编程风格**:文档中可能提及了代码风格的问题,比如变量命名、代码组织和注释习惯,这些都是编写高质量代码的重要方面。 - **编程原则**:可能讨论了代码的可读性、可维护性和性能优化。 ### 10. 跨平台编程 -...
- **解释**:高质量的C++程序应当具备良好的可读性和清晰度,使其他开发者能够容易理解代码的意图和逻辑。 - **实践建议**:使用有意义的变量名、函数名;合理地使用注释来解释复杂的逻辑或算法。 **1.2 4YeNv~g...
在IT领域,优化设计是软件开发过程中的一个重要环节,它涉及到如何提高程序的效率、减少资源消耗以及提升用户体验。...通过学习这些知识,开发者能够编写出更高效、更可靠的软件,提升整个项目的质量和性能。
在编写高质量的JAVA代码时,遵循一定的编程建议可以极大地提高代码的可读性、可维护性和性能。以下根据标题和描述中的内容,整理出30条JAVA编程的实用建议: 1. **命名规范**:使用有意义的驼峰命名法,如`...
在软件开发领域,编写高质量的代码是每个程序员追求的目标。良好的代码不仅能够提高程序的稳定性和可维护性,还能够提升团队的协作效率。以下是从给定文件中提炼出的五个关于如何每天写出好代码的建议。 #### 1. ...
- 降低维护成本:高质量的代码和完善的测试能减少未来维护和扩展时的困难。 - 保障安全:通过审查和测试,发现并预防安全风险,保护用户数据安全。 4. 测试文档的重要性 - 形式化记录:编写单元测试报告可以整理...
11. **单元测试**:为了保证代码质量,代码库可能包含JUnit或TestNG等单元测试框架的示例,用于编写和执行测试用例。 12. **Java库与框架**:可能包含使用Apache Commons、Google Guava等常用库,以及Spring、...
- 使用Javadoc等工具编写高质量的文档注释。 - 注释应清晰地解释代码的目的和功能。 ### 12. 变量的命名与使用 - 选择有意义的变量名,提高代码可读性。 - 减少全局变量的使用,避免副作用。 ### 13. 异常处理 - ...
- **开发人员**:关注代码质量和性能优化。 - **测试人员**:关注测试计划的制定和执行。 - **运维人员**:关注系统的稳定性和资源利用率。 #### 11. TPS问题排查 - **低TPS常见原因**: - **资源不足**:CPU、...
《C51编程规范》是针对基于C51语言进行单片机编程的一套...这些规范不仅适用于C51编程,也广泛适用于其他C语言环境,是编写高质量代码的基础。遵循这些规,可以提高团队协作效率,降低维护成本,确保项目的顺利进行。