StringBuilder与StringBuffer

来源:互联网 发布:贺知章回乡偶书二首 编辑:程序博客网 时间:2024/06/05 16:59

StringBuffer与StringBuilder的区别与联系

★相同点:        StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的.★不同点:        1)StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全,保证线程安全的时候,性能(速度)较低.         2) StringBuilder中的方法都没有使用了synchronized修饰符,不安全,但是性能较高.(建议使用StringBuilder)

因StringBuffer与StringBuilder的功能和方法相同,因此,下面只介绍StringBuilder类


StringBuilder类

StringBuilder类即字符生成器,新创建的StringBuilder对象初始容量为16个字符,可以自行指定初始长度,也可以动态地执行添加、删除和插入等字符串的编辑操作,大大提高了频繁增加字符串的效率。如果附加的字符超过可容纳的长度,则StringBuilder对象将自动增加长度以容纳被附加的字符。

Demo

通过例子来对比String与StringBuilder在对字符串做更新操作时所有时间的差别。

public class Jerque {    public static void main(String[] args) {        String str="";   //创建空字符串        //定义操作的起始时间        long starTime=System.currentTimeMillis();        //for循环100000次        for(long i=0;i<100000;i++){            str=str+i;  //循环追加字符串        }        //定义对字符串操作后的时间        long endTime=System.currentTimeMillis();        //计算执行的时间        long time=endTime-starTime;        System.out.println("String消耗的时间为"+time+"毫秒");        //创建StringBuilder        StringBuilder sb=new StringBuilder("");        //定义操作执行前的时间        starTime=System.currentTimeMillis();        for(long j=0;j<100000;j++){            sb.append(j); //循环追加字符        }        //定义操作执行后的时间        endTime=System.currentTimeMillis();        //操作执行的时间        time=endTime-starTime;        System.out.println("StringBuilder消耗的时间为 "+time+"毫秒");    }}

结果:
这里写图片描述


StringBuilder类是一个可变的字符序列,提供了一个与StringBuffer类兼容的API,但是并不保证与之同步,该类是StringBuffer类的一个简易替换,在字符串缓存被单个线程使用时要比StringBuffer类快。但是将StringBuilder的实例用于多个线程是不安全的,这时就要使用StringBuffer类来实现。


StringBuilder类常用的方法

StringBuilder类的构造方法有很多,主要是参数上的区别。

<1>StringBuilder append(String str)方法

该方法将参数str指定的字符串追加到字符串中。

builder.append(String str)

■ builder:声明的StringBuilder对象
■ str:追加到字符串中
■ 返回值:返回字符串的值,String类型

Demo:

使用StringBuilder append(String str)方法将字符串追加到字符串StringBuilder中

public class StringBuilderDemo {    public static void main(String[] args) {        //声明字符串        String s="good";        //构造初始值为hello的字符串        StringBuilder sb=new StringBuilder("hello");        //将s的值追加到sb中        sb.append(s);        System.out.println("追加后sb的值是:"+sb);    }}

结果:
追加后sb的值是:hellogood


append()方法不仅可以实现字符串的追加,还可以实现任何类型的数据追加,如int,boolean,char等,甚至其他的字符串也可以往里追加。


<2>StringBuilder append(StringBuffer sb)方法

该方法将参数指定的字符串缓存StringBuffer的值追加到StringBuilder中。

builder.append(StringBuffer sb);

■ builder:StringBuilder对象
■ sb:缓存中的值,追加到StringBuilder中
■ 返回值:返回将缓存的值追加到字符串生成器后的值,String型。

Demo

创建StringBuffer类,使用append(StringBuffer sb)方法将字符串缓存中的值追加到StringBuilder中。

public class stringBuffer {    public static void main(String[] args) {        //创建初始内容为Sunday的字符串缓存        StringBuffer buffer=new StringBuffer("Sunday");        //创建对象        StringBuilder builder=new StringBuilder();        builder.append(buffer);   //向builder中追加数据        System.out.println("追加后的builder的值是:"+builder);    }}

结果:
追加后的builder的值是:Sunday

<3>StringBuilder insert(int offset,String str)方法

该方法将参数指定的字符串str添加到offset指定的位置。

builder.insert(int offset,String str);

■ builder:StringBuilder的对象
■ offset:指定字符串添加的下标索引位置。
■ str:添加的字符串。
■ 返回值:返回添加的builder的值,String弄

Demo:

在项目中创建SubO类,在主方法中构造一个StringBuilder对象builder,初始值是字符串s1的值int,将字符串s2的值ser追加到builder的索引位置2处,并将builder输出。

public class SubO {    public static void main(String[] args) {        //创建字符串对象        String s1="int";        String s2="ser";        //创建对象        StringBuilder builder=new StringBuilder(s1);        //向索引值为2的位置插入s2        builder.insert(2,s2);        System.out.println("追加后builder的值是"+builder);    }}

结果:

追加后builder的值是insert

<4>StringBuilder delete(int start,String end)方法

该方法移除StringBuilder中的子字符串,该子字符串从指定的start处开始,到指定的end结束。

builder.delete(int start,String end)

■ builder:创建的StringBuilder对象。
■ start:删除子字符串的起始索引位置。
■ end:删除子字符串结尾的索引位置。
■ 返回值:返回删除子字符串后的builder的值,String型 。

Demo:

在项目中创建SubD类,在主方法中构造一个builder对象,初始值是StringBuidler,将指定的子字符从中删除,将结果输出。

public class SubD {    public static void main(String[] args) {        //创建StringBuilder的对象builder并初始化        StringBuilder builder=new StringBuilder("StringBuiler");        //删除字符串        StringBuilder s1=builder.delete(5, 5);        System.out.println("删除指定的字符串后:s1="+s1);        StringBuilder s2=builder.delete(5,10);        System.out.println("删除指定的字符串后:s2="+s2);    }}

结果:
删除指定的字符串后:s1=StringBuiler
删除指定的字符串后:s2=Striner


如果start和end位置相同,则StringBuilder值不变,按原样输出;索引start的值会被删除,end的值会被保留,说明删除的子字符包含开始索引不包含结尾索引。


<5>String toString()方法

该方法返回StringBuilder的字符串表示,即将StringBuilder转换为字符串,转换后StringBuilder的值不变。

str.toString();

■ str:StringBuilder对象的值,转换字符串。
■ 返回值:返回转换后的字符串。

Demo:

在项目中创建ToString类,并使用toString()方法将StringBuilder中的值转换为字符串。

public class ToString {    public static void main(String[] args) {        StringBuilder builder=new StringBuilder("HelloWord");        String s=builder.toString();        System.out.println("s="+s);        System.out.println("builder="+builder);    }}

结果:
s=HelloWord
builder=HelloWord


example-1

题目:将汉字和字母转换成Unicode码

在项目中创建CharacterUnicode类,将字符串转换成字符数组,再将汉字和字母转换成Unicode码追加到到StringBuilder中。

public class CharacterUnicode {    public static void main(String[] args) {        String text="中国 hello";  //获取用户输入的字符串        char[] charArray=text.toCharArray();  //获取字符串的字符        StringBuilder builder=new StringBuilder();        //遍历字符数组        for(char c:charArray){            //转化成Unicode码并追加到builder中            builder.append((int)c+" ");        }        System.out.println("“中国 hello”的Unicode码是:");        //转换成字符串并输出        System.out.println(builder.toString());    }}

结果:

“中国 hello”的Unicode码是:
20013 22269 32 104 101 108 108 111


example-2

题目:去掉字符串中重复的字符

在项目中创建SBDelete类,把每一个字符和其后面的进行比较,如果相同就利用StringBuilder的deleteChar()方法将后面的删除。

public class SBDelete {    public static void main(String[] args) {        String s="最是那一低头的温柔像一朵水莲花不胜凉风的娇羞道一声珍重 道一声珍重那一声珍重里有蜜甜的忧愁一一 ";        //创建StringBuilder字符串        StringBuilder sb=new StringBuilder(s);        System.out.println("原来的字符串是:"+sb);        System.out.println("原来的字符串长度是:"+sb.length());        //让每个字符和其后的进行比较        for(int i=0;i<sb.length();i++){            for(int j=i+1;j<sb.length();j++){                //如果字符串相同                if(sb.charAt(i)==sb.charAt(j)){                    //删除后面的字符串                    sb.deleteCharAt(j);                //  sb.delete(j, j+1);  删前不删后                }            }        }        System.out.println("现在的字符串是:"+sb);        System.out.println("现在的字符串长度是:"+sb.length());    }}

结果:

原来的字符串是:最是那一低头的温柔像一朵水莲花不胜凉风的娇羞道一声珍重 道一声珍重那一声珍重里有蜜甜的忧愁一一
原来的字符串长度是:48
现在的字符串是:最是那一低头的温柔像朵水莲花不胜凉风娇羞道声珍重 重里有蜜甜忧愁一
现在的字符串长度是:33


example-3

题目 : 实现字符串加密

在项目中创建EncryptUncrypt类,将字符串转换成字节数组,再将每个字节和密文字符异或操作进行加密;做相反运算就可以解密。

public class EncryptUncrypt {    public static String EAndU(String value,char secret){        //将需要加密的内容转换成字符数组        byte[] bt=value.getBytes();        for(int i=0;i<bt.length;i++){            bt[i]=(byte)(bt[i]^secret);  //进行异或运算        }        //返回加密后的字符串        return new String(bt,0,bt.length);    }    public static void main(String[] args) {        String value="我喜欢你";   //需要加密的内容        char secret='祈';   //密文        System.out.println("原字符串为:"+value);        //加密        String encrypt=EncryptUncrypt.EAndU(value,secret);        System.out.println("加密后的值:"+encrypt);        //解密        String uncrypt=EncryptUncrypt.EAndU(encrypt,secret);        System.out.println("解密后的值:"+uncrypt);    }}

结果:

原字符串为:我喜欢你
加密后的值:啔圍簋尗
解密后的值:我喜欢你


example-4

题目 : 验证字符串是否回文

解析:给定一个字符串,如果从前往后读和从后往前读完全一样就称为回文。

在项目中创建StringB类,使用reverse()方法把字符反转,然后比较两个字符串相同位置的字符是否相同,如果都相同就是回文。

public class StringB {    public static void main(String[] args) {        //获取字符串        String s="香莲碧水动风凉水动风凉夏日长长日夏凉风动水凉风动水碧莲香";        StringBuilder sb=new StringBuilder(s);        sb.reverse();        int count=0;        for(int i=0;i<sb.length();i++){            //如果有一个不相等的话,输出            if(s.charAt(i)!=sb.charAt(i)){                System.out.println("您输入的不是回文诗");            }            //如果相等一个,就自加1            if(s.charAt(i)==sb.charAt(i)){                count++;            }        }        //如果count和s的长度相等,则返回是回文诗        if(count==sb.length()){            System.out.println("您输入的是回文诗");        }    }}

结果:

您输入的是回文诗


原创粉丝点击