字符串变量拼接操作的底层原理

  1. 在java中,字符串变量拼接操作使用的是StringBuilder或StringBuffer类,这两个类都是可变的字符串缓冲区。java中的字符串是不可变的,因此在进行字符串拼接时需要使用可变的字符串缓冲区,以避免不必要的内存分配和复制。
  2. 具体来说,当使用  "+"  运算符连接两个字符串时,Java会创建一个StringBuilder对象,把第一个字符串添加到StringBuilder中,然后再把第二个字符串添加到StringBuilder中。最后,调用StringBuilder的toString()方法将StringBuilder中的所有字符转换成字符串,这样就得到了连接后的字符串。
  3. 由于StringBuilder和StringBuffer都使用了可变的字符数组,所以可以通过在数组中修改字符来更新字符串,而不必每次都创建一个新的字符串对象。这种方式在拼接字符串时比较高效,因为只需要分配一次内存空间,并重复使用该空间来添加所有的字符串。

 

package string;

import org.junit.Test;

public class StringTest5 {

    @Test
    public void test3() {
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        /*
         * 如下的 s1 + s2 的执行细节:(变量s是我临时定义的)
         * ① StringBuilder s = new StringBuilder();
         * ② s.append("a")
         * ③ s.append("b")
         * ④ s.toString() --> 约等于 new String("ab")
         * 补充:在jdk5.0之后使用的是StringBuilder,在jdk5.0之前使用的是StringBuffer
         * */
        String s4 = s1 + s2;
        System.out.println(s3 == s4);//false
    }

    @Test
    public void test4() {
        /*
        * 1.字符串拼接操作不一定使用的是StringBuilder!
        *    如果拼接符号左右两边都是字符串常量或常量引用,则仍然使用编译器优化,即非StringBuilder的方式。
        * 2.针对于final修饰符、方法、基本数据类型、引用数据类型的量的结构时,能使用上final的时候建议使用上。
        * */
        final String s1 = "a";
        final String s2 = "b";
        String s3 = "ab";
        String s4 = s1 + s2;
        System.out.println(s3 == s4);//true
    }

    @Test
    public void test5() {
        String s1 = "javaEEhadoop";
        String s2 = "javaEE";
        String s3 = s2 + "hadoop";
        System.out.println(s1 == s3);//false

        final String s4 = "javaEE";
        String s5 = s4 + "hadoop";
        System.out.println(s1 == s5);//true
    }
}
 @Test
    public void test3() {
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        /*
         * 如下的 s1 + s2 的执行细节:(变量s是我临时定义的)
         * ① StringBuilder s = new StringBuilder();
         * ② s.append("a")
         * ③ s.append("b")
         * ④ s.toString() --> 约等于 new String("ab")
         * 补充:在jdk5.0之后使用的是StringBuilder,在jdk5.0之前使用的是StringBuffer
         * */
        String s4 = s1 + s2;
        System.out.println(s3 == s4);//false
    }
  1. 该测试方法主要测试了字符串拼接的细节。在Java中,字符串可以通过“+”运算符进行拼接。但是,需要注意的是,这种方式会有一定的性能消耗,因为在每次拼接时都会创建一个新的字符串对象。因此,在性能要求严格的场合,建议使用StringBuilder或StringBuffer类来拼接字符串。
  2. 在该测试方法中,定义了三个字符串变量s1、s2和s3,其中s1和s2分别表示字符串“a”和“b”,s3表示字符串“ab”。然后,通过s1 + s2的方式将s1和s2拼接在一起,得到一个新的字符串s4。最后,比较s3和s4是否相等,发现它们并不相等,输出结果为false。
  3. 这是因为在执行s1 + s2操作时,其实是通过StringBuilder类来创建新的字符串对象的。具体来说,Java运行时会自动将s1和s2转换成StringBuilder对象,在StringBuilder对象上进行拼接操作,然后将结果转换成String对象并返回。因此,s1 + s2操作实际上等价于下面的代码
StringBuilder sb = new StringBuilder();
sb.append(s1);
sb.append(s2);
String s4 = sb.toString();

  • 由于s4是通过StringBuilder对象创建的,与s3所指向的字符串对象不同,因此比较它们的地址时会得到false。

你可能感兴趣的:(#,StringTable,java,开发语言,字符串变量的拼接)