发布于2020-11-19 20:52 阅读(508) 评论(0) 点赞(23) 收藏(5)
String、StringBuild、StringBuffer在java中都是可以操作字符串的对象,让我们来看看它们之间的区别和联系。
从结构上来看,它们都是final类,并且都是用char数组来存储内容的,不过StringBuild、StringBuffer没有用final和private来修饰这个数组。
StringBuild、StringBuffer都是继承AbstractStringBuilder,但StringBuffer为了解决线程安全问题,在对应的方法加上了关键字。
从线程安全方面来讲,String是不可变的,所以是线程安全的,因为多个线程调用String的方法都会去产生一个新的String,不会改变最初的内容。(之前我总是认为String做拼接的时候,是线程不安全的,所以String是线程不安全的,其实他指的线程安全并不是这个意思,因为拼接已经不是原子操作了,它只是指Sring调String的方法不会发生线程安全问题。)
StringBuild是非线程安全的,StringBuild也是用char数组去存储的,它其中某些方法是直接去操作这个数组的,比如append方法所以在多线程情况下是不安全的。
StringBuffer是线程安全的,虽然StringBuffer和StringBuild方法和属性几乎一样、都是继承AbstractStringBuilder。但是StringBuffer的方法有synchronize修饰。
String对象用“+”去拼接时,其实是使用了StringBuild对象。`
public static void main(String[] args) {
String a="mihou";
String b="tao";
String c=a+b;
}
上面是测试代码和对应的字节码。我们可以看到字节码中,先初始化了两个String对象,然后再新建了一个StringBuild对象,再调用了StringBuild的append方法,将两个String对象拼接进去,然后返回StringBuild的toString。
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
StringBuild的toString是返回一个String对象。
String c=“mihou”+“tao”,这个语句是没有创建StringBuild对象的,因为前面我们讲了必须是一个String对象使用了“+”,而“mihou”+“tao”其实只在常量池里面创建了“mihoutao”这一个对象,如果说“mihou”或者“tao”是String对象的话,就会创建StringBuild。那怎么去验证没有创建“mihou”对象呢?这里有两种办法,一种是去看字节码。
这里我们可以看到只初始化了一个“mihoutao”。
还有一种办法是使用intern方法,jdk至少1.7。
public static void main(String[] args) {
String a="mihou"+"tao";
String b=new String("mi")+new String("hou");
System.out.println(b.intern()==b);
}
这里输出是true,刚好证明了常量池中没有"mihou"对象。
上面我们讲了String在拼接时底层使用了Stringbuild,所以在这种拼接的时候效率是一样的,不过在循环中拼接就会循环创建Stringbuild,这时效率就会低些。而用Stringbuild可以把对象创建在循环外,避免这种情况。
String中的方法,每次对产生新的对象,而Stringbuild是在原来的基础上修改,所以String的开销大些。
Stringbuild和StringBuffer的差别在于StringBuffer要加锁,释放锁。主要的开销大小区别就在这里,所以Stringbuild的效率高。
综上所述,Stringbuild的效率总体来说是高于String和StringBuffer。String和StringBuffer的效率就要具体分析了,主要是看锁消耗和频繁创建对象哪个开销大。
原文链接:https://blog.csdn.net/bangemihoutao/article/details/109683572
作者:java战神
链接:http://www.javaheidong.com/blog/article/786/72373460691cfbf29048/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!