Java中的字符串及相关类的介绍

🔺jdk1.8 String底层是char[],字符数组。

1.String不是Java基本数据类型,不可以被继承,因为final关键字修饰.
2.String和StringBuilder、StringBuffer的区别
2.1 String线程安全,String的值创建后不能修改,修改String操作会创建新的String对象。
String不可变的性:
private final char value[];
🔺String不可被继承,存储string值的char数组被private修饰,且String没有提供对外的接口修改数组(不考虑反射和内存修改这些方法),每次修改String操作会创建新的String对象。
2.2 StringBuffer synchronized关键字保证线程安全
2.3 StringBuilder线程不安全,性能稍高。

3.String字符串拼接+操作
jdk1.8之前会创建新的String对象,1.8进行了优化,会在编译器处理变成基于StringBuilder的append方法处理。
大量字符串拼接推荐StringBuilder。
从JDK5开始,使用“+”拼接字符串,编译器编译后实际会自动优化为使用StringBuilder,所以如果是大量数据拼接推荐StringBuilder。
类似下面的拼接场景,“+”拼接方法每次循环都会new一个StringBuilder对象,内存和时间都会增加。

/**
 * 循环使用+拼接字符串
 */
@Test
public void testLoopStringConcatenation03ByPlus() {
    long startTime = System.currentTimeMillis();
    int count = 10000;
    String str = "testLoopStringConcatenation03ByPlus:";
    for (int i = 0; i < count; i++) {
        str = str + "-" + i;
    }
    System.out.println(str);
    long endTime = System.currentTimeMillis();
    System.out.println("testLoopStringConcatenation03ByPlus,拼接字符串" + count + "次,花费" + (endTime - startTime) + "秒");
}


 /**
 * 测试循环使用StringBuilder拼接字符串耗时
 */
@Test
public void testLoopStringConcatenation04ByStringBuilder() {
    long startTime = System.currentTimeMillis();
    int count = 100000;
    StringBuilder stringBuilder = new StringBuilder("testLoopStringConcatenation04ByStringBuilder:");
    for (int i = 0; i < count; i++) {
        stringBuilder.append("-");
        stringBuilder.append(i);
    }
    String str = stringBuilder.toString();
    System.out.println(str);
    long endTime = System.currentTimeMillis();
    System.out.println("testLoopStringConcatenation04ByStringBuilder,拼接字符串" + count + "次,花费" + (endTime - startTime) + "秒");
}

输出:
testLoopStringConcatenation03ByPlus,拼接字符串10000次,花费463秒
testLoopStringConcatenation04ByStringBuilder,拼接字符串10000次,花费13秒

🔺如果循环处理+仍然会创建多个新的StringBuilder对象,所以推荐StringBuilder。

4.String str1 = new String("abc")和String str2 = "abc"的区别?
首先都是去字符串常量池检查是否存在“abc”,如果有则直接使用,没有则在常量池中创建“abc”对象。

String str1 = new String("abc")创建几个对象?
一个或2个,如果字符串常量池中存在“abc”,则1个,否则两个;
字符串常量池中不存在“abc”,创建下面两个对象:
b.堆上一个字符串对象“abc”
a.字符串常量池中字符串对象“abc”的引用

5.intern方法
将字符串对象的引用保存在字符串常量池中。
Returns:
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
如果字符串常量池中存在内容一样的字符串对象的引用,就返回该引用;如果不存在则创建一个指向该字符串对象的引用并返回。

🔺String.equals的方法被重写过,比较的是字符串的值是否相等;Integer包装类的equals方法也重写了,比较的是值。

posted @ 2025-10-24 21:25  佩特莉可  阅读(6)  评论(0)    收藏  举报