String、StringBuffer、StringBuilder区别

一、String类

1、String类是不可变类,一旦String被创建,包含在这个对象中的字符串序列是不可变的,直至对象被销毁。

String类通过char数组存放字符串的。

1
2
3
4
5
6
7
8
9
10
<code class="language-java">/** 用于字符存储. */  
private final char value[];
/**
* Initializes a newly created {@code String} object so that it represents
* an empty character sequence. Note that use of this constructor is
* unnecessary since Strings are immutable.
*/
public String() {
this.value = "".value;
}</code>

在String的其他方法中,返回的都是new String(); 所以对String进行操作,返回的都是一个新的字符串。

2、字符串常量池

Java运行时会维护一个String Pool(String池),也叫字符串缓冲区。存储运行时产生的各种字符串,并且池中字符串不重复。

3、String对象创建原理

​ 1)当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个s在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则不在池中添加。

​ 2)Java中,只要是使用new关键字来创建对象,则一定会(在堆区)创建一个新的对象。

​ 3)使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,如果有就不会创建,但是绝对不会在堆栈区再去创建该String对象。

​ 4)使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。最后指向堆内存中的对象。

1
2
3
4
5
6
7
8
9
@Test
public void stringTest(){
String s1 = "hello world";
String s2 = "hello world";
String s3 = new String("hello world");
System.out.print(s1==s2);
System.out.print(s1==s3);
System.out.print(s2==s3);
}

返回结果是true,false,false。

二、StringBuffer和StringBuilder

​ 都继承了AbstractStringBuilder类,实现方法和使用都一样。,唯一区别是,StringBuffer方法加synchronized关键字,线程安全,而StringBuilder是线程非安全的,但是StringBuilder字符串拼接速度比StringBuffer快

​ StringBuilder相较于StringBuffer有速度的优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
显示 Gitment 评论