先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索【程序职场】关注这个执着的职场程序员。
价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验。
你们业余时间做的最多的事情是什么?哪一个消耗的时间长,我每天除了上班,下班回去就是写文章,看文章,然后学习。
虽然很充实,但是很单调啊,是不是自己该找一个兴趣爱好来搭配一下。
废话不多说了,开始今天的内容。
今天主要说说 Java中的 String、StringBuffer和StringBuilder ,都是我们经常使用的,可能有些你只是使用,并不知道他好在哪里,或者有些你现在的使用是错误的。
01
概念
至于概念基本都了解,他们都是处理字符串的,比如字符串定义,拼接,截取等等。
那么他们都是来自什么类呢?
1、java.lang.String
2、java.lang.StringBuffer
3、java.lang.StrungBuilder
扫描二维码关注公众号,回复: 12424269 查看本文章![]()
我们来说一下他们都有那些特点呢?
1,三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。
2,StringBuffer是线程安全,可以不需要额外的同步用于多线程中;
3,StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;
4,StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。
5,String实现了三个接口: Serializable、Comparable<String>、CarSequence
StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。
02
运行速度
对比的时候我首先考虑的就是速度,毕竟效率是最主要的,我们通过时间的长短来判定,那个效率高。
public static void main(String[] args) {
long a=new Date().getTime();
String cc="";
int n=10000;
for (int i = 0; i < n; i++) {
cc+="."+i;
}
System.out.println("String的时间"+(System.currentTimeMillis()-a)/1000.0+"s");
long s1=System.currentTimeMillis();
StringBuilder sb=new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append("."+i);
}
System.out.println("StringBuilder的时间"+(System.currentTimeMillis()-s1)/1000.0+"s");
long s2=System.currentTimeMillis();
StringBuffer sbf=new StringBuffer();
for (int i = 0; i < n; i++) {
sbf.append("."+i);
}
System.out.println("StringBuffer的时间"+(System.currentTimeMillis()-s2)/1000.0+"s");
}
打印结果:
String的时间1.558s
StringBuilder的时间0.004s
StringBuffer的时间0.012s
通过对比发现,StringBuilder效率是最高的,StringBuffer次之,String是最低的。所以建议大家以后考虑最好的使用。
03
安全考虑
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。
所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
建议使用的场景:
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
04
应用
在使用方面,这里说几个技术点,这样更能直观的了解。
1,String与StringBuffer相互转换
由于String一旦赋值就不能改变为了,所以需要转换,使用StringBuffer的功能,而StringBuffer还有多种操作。
转换方式:
(StringBuffer sb = new StringBuffer(str);)
2,StringBuffer向String转。
因为需要的结果是String类型,所以直接通过 toString的方式
(String str = sb.toString();)
3.字符串拼接实例
public class StringBufferDemo {
public static void main(String[] args) {
//创建StringBuffer对象
StringBuffer sb2 = new StringBuffer();
//因为append()返回缓冲区本身
sb2.append("程序职场").append(false); //链式编程
//sb.reverse();
//String s = new String(sb);//反转并转成String类型,不简洁
//反转并转成String类型
System.out.println(sb2.reverse().toString());
StringBuilder sb3 = new StringBuilder();
sb3.append("公众号:程序职场");
// sb3.setLength(1);//缓冲区设置为1
System.out.println(sb2.reverse().toString());
}
}
1,StringBuffer可以通过append的方式拼接字符串
2,String是直接new一个对象赋值
3, StringBuilder和StringBuffer 的用法都差不多
本文 Github ( 码云Gitee同步) https://github.com/ProceduralZC/JavaDevGuide/tree/master/code/JavaBasic/JavaString 已收录,欢迎 star。
我是【尔东双月】一枚执着的职场程序员,微信搜索【程序职场】关注我。别忘了三连啊,点赞、收藏、留言,随意给,我不挑。
知乎号: 程序职场
CSDN:程序职场
注:如果文章有任何问题,欢迎毫不留情地指正。