第8章 字符串常量和变量(随笔)

Java平台提供了两种字符串类型:String和StringBuffer、StringBuilder用来操作字符串。其中String为字符串常量,StringBuffer、StringBuilder均为字符串变量。

1.String类

String类的对象为字符串常量,而字符串常量String对象创建后是不可以更改的,举个例子说明一下:

public static void main(String[] args){
        String str = "cs";
         str = str + "dn";
        System.out.println(str);
    }

结果:
csdn

首先第一行创建一个对象,并且把"cs"赋值给str,然后在第二行,虚拟机新建一个对象str并把之前str的值和"dn"加起来再赋值给新str,将原来的str删除,所以说String对象创建之后是不可以更改的。

2.StringBuffer类

StringBuffer是线程安全的可变字符序列,且实体容量会随着存放的字符串增加而自动增加。

创建一个新的StringBuffer对象必须使用new方法,不能像String对象一样直接引用字符串常量。

StringBuffer str1 = new StringBuffer(); //创建一个对象,无初始值

StringBuffer str2 = new StringBuffer("abc"); //创建一个对象,初始值为abc

StringBuffer str3 = new StringBuffer(32); //创建一个对象,初始容量为32个字符

 StringBuffer创建的对象可以以下方法来更改,append,setCharAt,insert,reverse,delete,replace等方法来更改。下面看一个例子:

public static void main(String[] args){
        StringBuffer str = new StringBuffer("123456");
        str.append("789");     //追加字符串
        System.out.println(str);
        str.setCharAt(8,'H');  //将第8个字符改为字符H
        System.out.println(str);
        str.insert(6,"hh");   //在第六个字符后面插入字符串hh
        System.out.println(str);
        str.delete(6,8);      //删除第六到第八之间的字符串
        System.out.println(str);
        str.reverse();        //字符串反序
        System.out.println(str);
        str.replace(8,9,"hbnb");  //字符串内容替换
        System.out.println(str);

    }

结果:
123456789
12345678H
123456hh78H
12345678H
H87654321
H8765432hbnb

3.StringBuilder类

StringBuilder与StringBuffer类具有兼容的API,两者使用的方法也相同。创建对象的方法以及改值方法使用方式都相同。

与StringBuffer的不同之处在于StringBuilder不保证线程的同步,属于线程不安全。

4. 三者之间的联系

 String和StringBuffer、StringBuilder之间可以互相转换。

例如:

String str = "abc"

StringBuffer str1 = new StringBuffer(str);  //String转为StringBuffer

StringBuilder str2 = new StringBuilder(str); //String转为StringBuilder

str = str1.toString();  //StringBuffer转为String

str = str2.toString();  //StringBuilder转为String

5. 三者之间的不同

String只能赋值一次,每一次改变内容都会重新在堆中创建新的对象,原有的对象会引用新的对象,而每一次在内存中创建新的对象会对系统性能产生影响,降低JVM的效率。

而StringBuffer及StringBuilder与String类不同,每次操作改变都是对自身对象进行操作,不会生成新的对象,其所占空间会随着内容的增加而自动扩充,在做大量的修改操作时,不会因为生成大量匿名对象而影响系统性能。

总结一下:

1)操作少,数据少的场景一般用String

2)单线程,操作多,数据多,用StringBuilder

3)多线程,操作多,数据多,用StringBuffer

public static void main(String[] args){
        StringBuffer str = new StringBuffer("星城长沙");
        System.out.println(str);
        str.delete(0,2);
        System.out.println(str.toString());
        str.append("欢迎您");
        System.out.println(str.toString());
        str.replace(2,5,"等你来");
        System.out.println(str.toString());

}

结果:
星城长沙
长沙
长沙欢迎您
长沙等你来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值