一、String类
1、String类是不可变类,一旦String被创建,包含在这个对象中的字符串序列是不可变的,直至对象被销毁。
String类通过char数组存放字符串的。
1 | <code class="language-java">/** 用于字符存储. */ |
在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 |
|
返回结果是true,false,false。
二、StringBuffer和StringBuilder
都继承了AbstractStringBuilder类,实现方法和使用都一样。,唯一区别是,StringBuffer方法加synchronized关键字,线程安全,而StringBuilder是线程非安全的,但是StringBuilder字符串拼接速度比StringBuffer快
StringBuilder相较于StringBuffer有速度的优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。