漫谈Java程序的性能优化
Java使得复杂应用的开发变得相对简单。毫无
疑问,它的这种易用性对Java的大范围流行功不可没。然而,这种易用性实际上是一把双刃剑。一个设计良好的Java程序,性能表现往往不如一个同样设计
良好的C++程序。在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身。养成好的代码编写习惯非常重要,比如正确地、巧妙地
运用java.lang.String类和java.util.Vector类,它能够显著地提高程序的性能。下面我们就来具体地分析一下这方面的问题。
在java中,使用最频繁、同时也是滥用最多的
一个类或许就是java.lang.String,它也是导致代码性能低下最主要的原因之一。请考虑下面这个例子:
String s1 = "Testing
String";
String s2 = "Concatenation Performance";
String s3 = s1 +
" " + s2;
几乎所有的Java程序员都知道上面的代码效率
不高。那么,我们应该怎么办呢?也许可以试试下面这种代码:
StringBuffer s = new
StringBuffer();
s.append("Testing String");
s.append(" ");
s.append("Concatenation
Performance");
String s3 = s.toString();
这些代码会比第一个代码片段效率更高吗?答案是
否定的。这里的代码实际上正是编译器编译第一个代码片段之后的结果。既然与使用多个独立的String对象相比,StringBuffer并没有使代码有
任何效率上的提高,那为什么有那么多的Java书籍批评第一种方法、推荐使用第二种方法?
第二个代码片段用到了StringBuffer
类(编译器在第一个片段中也将使用StringBuffer类),我们来分析一下StringBuffer类的默认构造函数,下面是它的代码:
public StringBuffer() {
this(16); }
默认构造函数预设了16个字符的缓存容量。现在
我们再来看看StringBuffer类的append()方法:
public synchronized
StringBuffer append(String str) {
if (str == null) {
str =
String.valueOf(str);
}
int len = str.length();
int newcount
= count + len;
if (newcount > value.length)
expandCapacity(newcount);
str.getChars(0, len, value, count);
count
= newcount; return this;
}
append()方法首先计算字符串追加完成后
的总长度,如果这个总长度大于StringBuffer的存储能力,append()方法调用私有的expand
相关文档:
package arrays.myArray;
public class BinaryTree {
private Node root;
// 添加数据
public void add(int data) {
// 递归调用
if (null == root)
root = new Node(data, null, null);
else
addTree(root, data);
......
package arrays.myArray;
public class MyArrayList {
private Object[] arrObj = new Object[3];
private int size = 0;
// 长度
public int size() {
return size;
}
// insert
public void add(Object obj) {
add(size,obj);
&nb ......
package arrays.myArray;
import java.util.Scanner;
public class SortObject {
private static int intercePosition = 0; // 记录单个运算数据的长度
private static int[] intercePositionIndex = null; // 记录“(”的下标
private static int[] intercePositionEnd = null; // 记录 ......
package game;
public class HanTa {
public static int i = 0;
public static void main(String[] args){
calc('A', 'B', 'C', 2);
System.out.println("最少需要"+i+"步。");
}
//汉罗塔游戏计算
public static void calc(char src, char ilde, c ......
package game;
public class JieCeng {
public static void main(String[] args){
System.out.println(fun(10));
}
public static int fun(int n){
if(1==n)
return 1;
System.out.println( n * fun(n-1));
return ......