String 的字符串链接时的内存问题

    xiaoxiao2026-08-27  3

    最近在看字符串链接的问题想到字符串用+号链接。例如以下的代码

    String s1 = "a"; String s2 = s1 + "b"; String s3 = "a" + "b"; System.out.println(s2 == "ab"); System.out.println(s3 == "ab");

    第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。

    比如以下例子:

    String str = "a"; str += "b";此时不是简单得在常量池里面将a的字符串加上b就完事的,而是此时的str+="b";相当于str = new StringBuffer(str).append("b").toString();所以String每次用“+”链接都相当于在堆内存中先实例化一个StringBuffer然后再调用其append方法,最后调用toString方法转换成字符串。

    所以如果“+”两边都是字符串的话,javac编译就会对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。而如果两边其中有一个是表达式的话javac编译就可能不会对字符串常量直接相加的表达式进行优化,需要等到运行时才会去进行运算,所以在第一条语句打印的结果为false,第二条语句打印的结果为true。

    转载请注明原文地址: https://ju.6miu.com/read-1311623.html
    最新回复(0)