七种java字符串反转比较得出String与StringBuffer的效率

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值. 
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的. 



import java.util.Stack;



/**
 * @StringReverse
 * @hp
 * @上午03:46:45 @ author:fanjf @ 七种java字符串反转
 */
public class StringReverse {


/**
* 函数功能说明: 创建者: fanjf 修改者: fanjf 修改日期: 2013-12-11 修改内容

* @参数:
* @return void
* @throws
*/


public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer("a");


for (int i = 1; i < 50000; i++) {
sb.append(i % 10);
}
Long timestart = System.currentTimeMillis();// 任务开始时间
timestart = System.currentTimeMillis();
reverse1(sb.toString());
System.out.println(System.currentTimeMillis() - timestart);


timestart = System.currentTimeMillis();
reverse2(sb.toString());
System.out.println(System.currentTimeMillis() - timestart);


timestart = System.currentTimeMillis();
reverse3(sb.toString());
System.out.println(System.currentTimeMillis() - timestart);


timestart = System.currentTimeMillis();
reverse4(sb.toString());
System.out.println(System.currentTimeMillis() - timestart);


timestart = System.currentTimeMillis();
reverse5(sb.toString());
System.out.println(System.currentTimeMillis() - timestart);


timestart = System.currentTimeMillis();
reverse6(sb.toString().toCharArray());
System.out.println(System.currentTimeMillis() - timestart);

timestart = System.currentTimeMillis();
//System.out.println(reverse7(sb.toString()));
reverse7(sb.toString());
System.out.println(System.currentTimeMillis() - timestart);


}


/**

* 函数功能说明: 递归翻转 创建者: fanjf 修改者: fanjf 修改日期: 2013-12-11 修改内容

* @参数:
* @return void
* @throws
*/
public static String reverse1(String s) {


int length = s.length();
if (length <= 1) {
return s;
}
String left = s.substring(0, length / 2);
String right = s.substring(length / 2, length);
return reverse1(right) + reverse1(left);
}


/**

* 函数功能说明:循环逆置 创建者: fanjf 修改者: fanjf 修改日期: 2013-12-11 修改内容

* @参数:
* @return String
* @throws
*/
public static String reverse2(String in) {


String out = "";
for (int i = in.length(); i > 0;) {
out = out + in.charAt(--i);
}
return out;
}


/**

* 函数功能说明:借用toCharArray提升效率 创建者: fanjf 修改者: fanjf 修改日期: 2013-12-11 修改内容

* @参数:
* @return String
* @throws
*/
public static String reverse3(String in) {


String reverse = "";


char[] array = in.toCharArray();
for (int i = array.length - 1; i >= 0; i--)
reverse += array[i];


return reverse;
}


/**

* 函数功能说明:StringBuffer的reverse函数,简洁编码 创建者: fanjf 修改者: fanjf 修改日期: 2013-12-11
* 修改内容

* @参数:
* @return String
* @throws
*/
public static String reverse4(String in) {
return new StringBuffer(in).reverse().toString();
}


/**

* 函数功能说明:借用java的栈 创建者: fanjf 修改者: fanjf 修改日期: 2013-12-11 修改内容

* @参数:
* @return String
* @throws
*/
public static String reverse5(String s) {
char[] str = s.toCharArray();
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < str.length; i++)
stack.push(str[i]);
String reversed = "";
for (int i = 0; i < str.length; i++)
reversed += stack.pop();
return reversed;


}


public static String reverse6(char[] value) {
boolean hasSurrogate = false;
int count = value.length;
int n = count - 1;


for (int j = (n - 1) >> 1; j >= 0; --j) {
char temp = value[j];
char temp2 = value[n - j];
if (!hasSurrogate) {
hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE)
|| (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);
}
value[j] = temp2;
value[n - j] = temp;
}
if (hasSurrogate) {
// Reverse back all valid surrogate pairs
for (int i = 0; i < count - 1; i++) {
char c2 = value[i];
if (Character.isLowSurrogate(c2)) {
char c1 = value[i + 1];
if (Character.isHighSurrogate(c1)) {
value[i++] = c1;
value[i] = c2;
}
}
}
}
StringBuffer sb = new StringBuffer();
for (int j = 0; j <= n; j++) {
sb.append(value[j]);
}
return sb.toString();


}


/**

* 函数功能说明: 递归翻转 创建者: fanjf 修改者: fanjf 修改日期: 2013-12-11 修改内容

* @参数:
* @return void
* @throws
*/
public static String reverse7(String s) {
char[] value = s.toCharArray();
int n = value.length - 1;


StringBuffer sb = new StringBuffer();
for (int j = n; j >= 0; j--) {
sb.append(value[j]);
}
return sb.toString();
}

}

运行结果:

16
2153
2238
5
2265
3
3


猜你喜欢

转载自blog.csdn.net/jifeijixufly/article/details/17261201