35个可以飞快提高千倍效率的Java语言代码小技巧,你值得拥有!( 三 )


19、实现Randomaccess接口的集合比如ArrayList , 应当使用最普通的for循环而不是foreach循环来遍历
这是JDK推荐给用户的 。JDK API对于RandomAccess接口的解释是:实现RandomAccess接口用来表明其支持快速随机访问 , 此接口的主要目的是允许一般的算法更改其行为 , 从而将其应用到随机或连续访问列表时能提供良好的性能 。实际经验表明 , 实现RandomAccess接口的类实例 , 假如是随机访问的 , 使用普通for循环效率将高于使用foreach循环;反过来 , 如果是顺序访问的 , 则使用Iterator会效率更高 。可以使用类似如下的代码作判断:
if (list instanceof RandomAccess){ for (int i = 0; i < list.size(); i++){}}else{Iterator<?> iterator = list.iterable(); while (iterator.hasNext()){iterator.next()}}foreach循环的底层实现原理就是迭代器Iterator , 参见Java语法糖1:可变长度参数以及foreach循环原理 。所以后半句”反过来 , 如果是顺序访问的 , 则使用Iterator会效率更高”的意思就是顺序访问的那些类实例 , 使用foreach循环去遍历 。
20、使用同步代码块替代同步方法
这点在多线程模块中的synchronized锁方法块一文中已经讲得很清楚了 , 除非能确定一整个方法都是需要进行同步的 , 否则尽量使用同步代码块 , 避免对那些不需要进行同步的代码也进行了同步 , 影响了代码执行效率 。
21、将常量声明为static final , 并以大写命名
这样在编译期间就可以把这些内容放入常量池中 , 避免运行期间计算生成常量的值 。另外 , 将常量的名字以大写命名也可以方便区分出常量与变量
22、不要创建一些不使用的对象 , 不要导入一些不使用的类
这毫无意义 , 如果代码中出现”The value of the local variable i is not used”、”The import java.util is never used” , 那么请删除这些无用的内容
23、程序运行过程中避免使用反射
关于 , 请参见反射 。反射是Java提供给用户一个很强大的功能 , 功能强大往往意味着效率不高 。不建议在程序运行过程中使用尤其是频繁使用反射机制 , 特别是Method的invoke方法 , 如果确实有必要 , 一种建议性的做法是将那些需要通过反射加载的类在项目启动的时候通过反射实例化出一个对象并放入内存—-用户只关心和对端交互的时候获取最快的响应速度 , 并不关心对端的项目启动花多久时间 。
24、使用数据库连接池和线程池
这两个池都是用于重用对象的 , 前者可以避免频繁地打开和关闭连接 , 后者可以避免频繁地创建和销毁线程
25、使用带缓冲的输入输出流进行IO操作
带缓冲的输入输出流 , 即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream , 这可以极大地提升IO效率
26、顺序插入和随机访问比较多的场景使用ArrayList , 元素删除和中间插入比较多的场景使用LinkedList这个 , 理解ArrayList和LinkedList的原理就知道了
27、不要让public方法中有太多的形参
public方法即对外提供的方法 , 如果给这些方法太多形参的话主要有两点坏处:
1、违反了面向对象的编程思想 , Java讲求一切都是对象 , 太多的形参 , 和面向对象的编程思想并不契合
2、参数太多势必导致方法调用的出错概率增加
至于这个”太多”指的是多少个 , 3、4个吧 。比如我们用JDBC写一个insertStudentInfo方法 , 有10个学生信息字段要插如Student表中 , 可以把这10个参数封装在一个实体类中 , 作为insert方法的形参 。
28、字符串变量和字符串常量equals的时候将字符串常量写在前面
这是一个比较常见的小技巧了 , 如果有以下代码:
String str = "123";if (str.equals("123")) {...}建议修改为:String str = "123";if ("123".equals(str)){...}这么做主要是可以避免空指针异常
29、请知道 , 在java中if (i == 1)和if (1 == i)是没有区别的 , 但从阅读习惯上讲 , 建议使用前者
平时有人问 , ”if (i == 1)”和”if (1== i)”有没有区别 , 这就要从C/C++讲起 。
在C/C++中 , ”if (i == 1)”判断条件成立 , 是以0与非0为基准的 , 0表示false , 非0表示true , 如果有这么一段代码:


推荐阅读