详解java中String、StringBuilder、StringBuffer的区别
你知道string、stringbuilder、stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗?
别急,这篇文章带你解决这些问题。
可变性
首先,string是字符串,我们一般这样声明:
string s = "abc";
string类使用被final修饰的char数组来存储字符串的内容,它的一大特性就是不可变,怎么理解这个不可变呢?
我们知道,一个类被final修饰,那么这个类无法被继承,方法也不能被重写,属性也不能改变。
看看这段代码:
string s = "abc"; s = s+1; system.out.print(s); // 输出: abc1
表面上s的值由abc变成了abc1,其实并不是这样,而是在进行+1的操作时,重新创建了一个新的string对象,并给它赋值为abc1.
stringbuilder和stringbuffer这俩货同样用char数组存字符串,但并没有用final修饰,因此它们创建的内容的可变的,并不像string那样创建了一个新的对象。
线程安全性
string是常量,自然没有线程不安全的问题,但是stringbuilder和stringbuffer是变量,就需要考虑这个。
我们查看stringbuilder的源码:
@override public int compareto(stringbuilder another) { return super.compareto(another); } @override public stringbuilder append(object obj) { return append(string.valueof(obj)); }
再看看stringbuffer的:
@override public synchronized int compareto(stringbuffer another) { return super.compareto(another); } @override public synchronized int length() { return count; } @override public synchronized int capacity() { return super.capacity(); }
发现没有,stringbuffer的每个方法都加了synchronized同步锁,保证了线程安全,而stringbuilder没加。
性能比较
stringbuilder>stringbuffer>string
string作为常量,每次更改都创建新对象,性能最低;stringbuilder没有stringbuffer身上的锁,因此性能更好。
总结
- 如果是单线程场景,因为不用考虑线程安全,推荐使用stringbuilder
- 如果是多线程场景,推荐使用stringbuffer
- 如果操作的数据不需要改变,使用string即可
到此这篇关于java中string、stringbuilder、stringbuffer的区别的文章就介绍到这了,更多相关java中string、stringbuilder、stringbuffer的区别内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: 中国皮革服装知名品牌,销量最高的皮衣品牌
下一篇: golang获取网卡信息操作
推荐阅读
-
JAVASE 小白学习笔记 (12-3)Java中的常用类--StringBuffer类、StringBuilder类
-
基于Java中throw和throws的区别(详解)
-
详解Java中super的几种用法并与this的区别
-
详解Java中wait和sleep的区别
-
基于Java中throw和throws的区别(详解)
-
java中public class与class的区别详解
-
Java中Integer.valueOf,parsetInt() String.valueOf的区别和结果代码解析
-
浅谈java中String的两种赋值方式的区别
-
Java中Vector与ArrayList的区别详解
-
详解java中float与double的区别