String , String Builder , String Buffer的区别浅析
String , String Builder , String Buffer的区别
首先来看这三个类分别代表什么什么意思
String
类代表字符串 ,但是它是代表一个常量
,底层是一个被final修饰的数组,它的值在创建之后不能够被更改。
StringBuilder(字符串缓冲区)
与StringBuffer(字符串缓冲区)
虽然也是代表字符串并且底层也是数组,但是这个数组没有被final
修饰,他们都是可变量
,他们在创建对象实例并且赋值之后可以重新更改值得内容。
这三者的区别主要存在与两点:运行速度
和线程安全
运行速度:
三者的运行速度大小如下:StringBuilder > StringBuffer > String
原因:
先来看一段代码:
1 | String s="Hello"; |
上述代码输出的结果是Hello [[email protected]
和HelloWorld [[email protected]
,这段代码在虚拟机上的执行过程实际是这样的:首先,在创建了一个对象s
之后,将Hello
赋值给了s
,然后又创建了一个同名对象s
,并且将之前的s
对象的值和World
进行拼接之后赋值给了这个新的s
。那么第一次创建的对象s去哪了呢?答案是被虚拟机的垃圾回收机制回收掉了(连同对象s
的值)。因此,在对String
类型的对象进行操作的时候实际上就是一个不断创建同名新对象的删除旧对象的一个过程,这期间需要不断的消耗虚拟机的资源,因此执行速度很慢。
但是StringBuilder
和StringBuffer
的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
线程安全:
StringBuilder
是线程不安全的,StringBuffer
是线程安全的
总结:
String:适用于少量的字符串操作的情况
String Builder:适用于单线程下在字符缓冲区进行大量操作的情况
String Buffer:适用多线程下在字符缓冲区进行大量操作的情况
StringBuilder/StringBuilder
- - > String
可以使用StringBuilder
的构造方法:StringBuilder(String str)
String
- - >StringBuilder/StringBuilder
可以使用StringBuilder
的toString
方法
String
常用构造方法:
1 | public ():空构造 |
常用函数:
1 | String类的获取功能 |
注意:
1.String s=new String("hello");String s="hello"区别:
前者创建两个对象(常量池中没有这个hello对象的时候)或一个对象(常量池中有这个hello对象的时候),后者创建一个对象(常量池中没有这个hello对象的时候)或不创建对象(常量池中有这个hello对象的时候)
2.字符串如果是变量相加,先开空间,在拼接。
1 | String s1="Hello",s2="World"; |
3.字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
1 | "Hello"+"World" |
String Builder和String Buffer
常用构造方法(String Builder为例,String Buffer大致看了一眼,和String Builder几乎一摸一样):
1 | StringBuilder() 构造一个没有字符的字符串构建器,初始容量为16个字符。 |
常用方法(String Builder为例,String Buffer大致看了一眼,和String Builder几乎一摸一样):
1 | StringBuilder append(参数) 将指定参数的字符串表示附加到序列中。除了byte/short |