关于java100个优化代码的信息( 六 )


注:jdk5中加入了对泛型的支持,已经可以在使用ArrayList时进行类型检查 。
从这一点上看来,ArrayList与数组的区别主要就是由于动态增容的效率问题了
28、尽量使用HashMap 和ArrayList ,除非必要,否则不推荐使用HashTable和Vector ,后者由于使用同步机制,而导致了性能的开销 。
29、StringBuffer 和StringBuilder的区别:
java.lang.StringBuffer线程安全的可变字符序列 。一个类似于 String 的字符串缓冲区 , 但不能修改 。
StringBuilder 。与该类相比,通常应该优先使用 java.lang.StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快 。为了获得更好的性能,在构造 StirngBuffer 或 StirngBuilder 时应尽可能指定它的容量 。当然,如果你操作的字符串长度不超过 16 个字符就不用了 。相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%-15% 左右的性能提升 , 但却要冒多线程不安全的风险 。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非你能确定你的系统的瓶颈是在 StringBuffer 上 , 并且确定你的模块不会运行在多线程模式下,否则还是用 StringBuffer 吧 。
30、尽量避免使用split
除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的 StringUtils.split(string,char) , 频繁split的可以缓存结果 。
其他补充:
1、及时清除不再使用的对象,设为null
2、尽可能使用final,static等关键字
3、尽可能使用buffered对象
如何优化代码使JAVA源文件及编译后CLASS文件更小
1 尽量使用继承 , 继承的方法越多,你要写的代码量也就越少
2 打开JAVA编译器的优化选项: javac -O 这个选项将删除掉CLASS文件中的行号 , 并能把
一些private, static,final的小段方法申明为inline方法调用
3 把公用的代码提取出来
4 不要初始化很大的数组,尽管初始化一个数组在JAVA代码中只是一行的代码量,但
编译后的代码是一行代码插入一个数组的元素,所以如果你有大量的数据需要存在数组
中的话,可以先把这些数据放在String中,然后在运行期把字符串解析到数组中
5 日期类型的对象会占用很大的空间,如果你要存储大量的日期对象,可以考虑把它存储为
long型,然后在使用的时候转换为Date类型
6 类名 , 方法名和变量名尽量使用简短的名字 , 可以考虑使用Hashjava, Jobe, Obfuscate and Jshrink等工具自动完成这个工作
7 将static final类型的变量定义到Interface中去
8 算术运算 能用左移/右移的运算就不要用*和/运算,相同的运算不要运算多次
2. 不要两次初始化变量
Java通过调用独特的类构造器默认地初始化变量为一个已知的值 。所有的对象被设置成null,integers (byte, short, int, long)被设置成0 , float和double设置成0.0,Boolean变量设置成false 。这对那些扩展自其它类的类尤其重要,这跟使用一个新的关键词创建一个对象时所有一连串的构造器被自动调用一样 。
3. 在任何可能的地方让类为Final
标记为final的类不能被扩展 。在《核心Java API》中有大量这个技术的例子,诸如java.lang.String 。将String类标记为final阻止了开发者创建他们自己实现的长度方法 。
更深入点说 , 如果类是final的,所有类的方法也是final的 。Java编译器可能会内联所有的方法(这依赖于编译器的实现) 。在我的测试里,我已经看到性能平均增加了50% 。

推荐阅读