参考链接:http://www.programcreek.com/2014/02/leetcode-reverse-words-in-a-string-java/;
http://blog.csdn.net/ithomer/article/details/7669843#comments;
http://www.wikihow.com/Reverse-the-String-in-Java
反转
反转一个字符串,比如”hello”,反转成为”olleh”,可以使用StringBuilder中的reverse方法,或者递归,或者直接使用for循环。
package com.javaTest;
public class Reverse {
public static void main(String[] args) {
String str = "hi, I am here";
System.out.println("原字符串:"+str);
System.out.println("使用reverse:"+reverse(str)+"\n"+"使用append:"+append(str)+"\n"+"使用recurse:"+recurse(str));
}
//方法1:使用 StringBuilder 类的 reverse 的方法
public static String reverse(String str){
//str==null 判断引用是否指向任何对象,
//str.length<=1,判断引用对象是否为空字符串,或者长度为1的字符串
if((str==null)||(str.length()<=1)){
return str;
}
StringBuilder builder =new StringBuilder(str);
return(builder.reverse().toString());
}
//方法2:StringBuilder 的 append 方法
public static String append(String str){
if((str==null)||(str.length()<=1)){
return str;
}
StringBuilder builder =new StringBuilder();
char [] ch=str.toCharArray();
for(int i=ch.length-1;i>=0;i--){
builder.append(ch[i]);
}
// 或者直接使用 String 的 charAt() 方法
// for(int i=str.length()-1;i>=0;i--){
// builder.append(str.charAt(i));
// }
return (builder.toString());
}
//方法3:recursive function 递归方法
public static String recurse(String str){
if((str==null)||(str.length()<=1)){
return str;
}
//第一个字符放到最后,前面的继续反转
return recurse(str.substring(1))+str.charAt(0);
}
}
输出:
当要求的不是每个字符的反转,比如“I am here” 要求返回 “here am I “,用 String 的split 方法分割成数组即可:
package com.javaTest;
public class reverseString {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "I am here";
System.out.println(reverse(str));
}
public static String reverse(String str){
if((str==null)||(str.length()<=1)){
return str;
}
String [] strArray = str.split(" ");
StringBuilder builder = new StringBuilder();
for(int i = strArray.length-1;i>=0;i--){
if(i!=0){
builder.append(strArray[i]+" ");
}else {
builder.append(strArray[i]);
}
}
return (builder.toString());
}
}
StringBuilder
反转过程中涉及到了StringBuilder,看到String、StringBuilder、StringBuffer 用法比较 这篇文章。
String 是字符串常量,StringBuilder 是字符串变量。其主要区别就是 String 是不可变的对象,因此每次对String 进行修改时,都等于生成了一个新的 String 对象,然后指针指向新的String 对象,每次生成对象会对系统性能产生影响。
StringBuilder 是一个类似于 String 的字符串缓冲区,使用StringBuilder()方法时,出事容量为 16 个字节,当内部缓冲区溢出,容量自动增大。它每次对对象本身进行操作,而不是生成新的对象。因此字符串经常改变时最好使用 StringBuilder,主要操作就是 append 和 insert 方法。(ps :StringBuilder 的对象时StringBuilder 类型,要赋值给 String 的话必须要用toString())
StringBuilder 和 StringBuffer
先看 StringBuilder 的 append 方法:
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuffer 的append 方法:
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
return this;
}
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
可以看到StringBuffer 有Synchronized 关键字修饰,可以起到同步的作用。因此StringBuffer 是线程安全的,可以在多线程环境使用。为此付出的代价就是降低了执行效率。StringBuilder 非线程安全,由于不支持同步,所以速度会比 StringBuffer 更快。因此,如果在多线程环境可以使用StringBuffer进行字符串连接操作,单线程环境使用StringBuilder,它的效率更高。