字符反转以及涉及到的 StringBuilder

来源:互联网 发布:网络安全管理培训 编辑:程序博客网 时间:2024/04/29 23:53

参考链接: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,它的效率更高。

0 0
原创粉丝点击