在Java中,如何使用字符串分配内存?

在Java中,如何使用字符串分配内存?,java,string,memory,string-pool,Java,String,Memory,String Pool,具有以下代码: String s="JAVA"; for(i=0; i<=100; i++) s=s+"JVM"; 创建了多少个字符串?我的猜测是创建了103个字符串: 1:字符串池中的字符串JAVA 1:字符串JVM也在字符串池中 101:在循环中每次都会创建新字符串s,因为该字符串是一个不可变的类在字符串上使用“+”运算符时,JAVA每次都会将其替换为StringBuilder 因此,对于每个循环,您都会创建一个StringBuilder,它使用append方法连接两个字符

具有以下代码:

String s="JAVA";
for(i=0; i<=100; i++)
     s=s+"JVM";
创建了多少个字符串?我的猜测是创建了103个字符串:

1:字符串池中的字符串JAVA

1:字符串JVM也在字符串池中


101:在循环中每次都会创建新字符串s,因为该字符串是一个不可变的类

在字符串上使用“+”运算符时,JAVA每次都会将其替换为StringBuilder


因此,对于每个循环,您都会创建一个StringBuilder,它使用append方法连接两个字符串s和JVM,然后通过toString方法将其转换为字符串当在字符串上使用“+”运算符时,JAVA每次都会将其替换为StringBuilder


因此,对于每个循环,您都创建一个StringBuilder,它使用append方法连接两个字符串s和JVM,然后通过toString方法将其转换为字符串,编译时字符串表达式放入字符串池。 s=s+JVM不是编译时常量表达式。所以每次它都在堆中创建一个新的字符串对象


有关更多详细信息,请参见此

编译时字符串表达式被放入字符串池。 s=s+JVM不是编译时常量表达式。所以每次它都在堆中创建一个新的字符串对象


有关更多详细信息,请参见此

字符串连接是通过StringBuilderor StringBuffer类及其append方法实现的。字符串转换是通过toString方法实现的,该方法由Object定义并由Java中的所有类继承。有关字符串连接和转换的更多信息,请参阅Gosling、Joy和Steele,Java语言规范


在您的例子中,创建了103个字符串,循环中每个字符串一个,Java和JVM两个字符串。

字符串连接是通过StringBuilderor StringBuffer类及其append方法实现的。字符串转换是通过toString方法实现的,该方法由Object定义并由Java中的所有类继承。有关字符串连接和转换的更多信息,请参阅Gosling、Joy和Steele,Java语言规范


在您的情况下,将创建103个字符串,循环中每个字符串一个,Java和JVM两个字符串。

jit可能会尝试将其替换为字符的arraylist,直到为其引用s为止used@huseyintugrulbuyukisik-1好吧,它不会。。。到目前为止,在Java的一个发行版中。2根据JLS 15.18.1的严格阅读,JIT编译器是不允许这样做的。JIT可以尝试用字符的arraylist替换它,直到为其引用s为止used@huseyintugrulbuyukisik-1好吧,它不会。。。到目前为止,在Java的一个发行版中。2根据JLS 15.18.1的严格阅读,JIT编译器不允许这样做。JLS声明可以使用StringBuilder实现字符串连接。它没有声明需要以这种方式实现。JLS声明可以使用StringBuilder实现字符串连接。它没有说明需要以这种方式实施。