StringBuilder与StringBuffer学习

由于String是不可更改类型,每次改变都的重新创建了一个对象,当遇到大量的字符串操作时,极为消耗资源,且字符串的相加实际运行如下:

StringBuilder stringBuilder = new StringBuilder("abc").append("de").toString();
// 因此如果是循环应该如下
for (int i=0;i<10;i++){
    StringBuilder stringBuilder = new StringBuilder("");
    stringBuilder.append(i);
    stringBuilder.toString();
}

如果是普通的字符串相加,则会每次循环都new 了一个StringBuilder对象,对资源的消耗极大,拖慢其运行速度,但如果使用StringBuilder创建对象,则只需要使用其 append 方法,无需在其中不断的生产对象,Stringbuffer 与 StringBuilder 其源码基本都是一样的,只是除了其成员方法前面多出了一个 synchronized 关键字,如下所示:

synchronized: 实现线程同步,由于多线程运行的不确定性,若其中有一个方法,我们后一个对象处理需要其前一个对象处理的结果,但是多线程,可能使得前一个对象还未处理完成,第二个对象也进入了方法中,此时就会导致其运行错误,但是由于 synchronized 的存在,限制了对象抢占资源。实际操作中:运行时间 "a"+"b"<StringBuilder<StringBuffer<String 。

因此,如果是少量字符串操作,使用 String,大量字符串操作,使用 StringBuilder,多线程字符串操作,使用 StringBuffer。

final String str = "ab";  String str1 = "ab";  String str2 = "abcd";
String str3 = "ab"+"cd";  String str4 = str1+"cd";  String str5 = str+"cd";
System.out.println((str3==str2)+" "+(str4==str2)+" "+(str5==str2));
# true, false, true

final:会在常量池中留下一个副本,再次调用时,变量会直接换成常量池中的副本。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值