Java 在以下代码中创建的字符串对象的总数?
请在下面找到代码的字节码Java 在以下代码中创建的字符串对象的总数?,java,string,Java,String,请在下面找到代码的字节码 public static void main(String[] args) { String a = new String("abc"); String b = "abc"; String c = "abc" + "KDF" + "gh" +"rt" +"jk"; } 我没有阅读/理解字节码的经验,我猜总共创建了3个字符串对象 让我知道你的想法。字符串是不变的 阅读这里的讨论。我应该帮助你。 简言之。如果您
public static void main(String[] args) {
String a = new String("abc");
String b = "abc";
String c = "abc" + "KDF" + "gh" +"rt" +"jk";
}
我没有阅读/理解字节码的经验,我猜总共创建了3个字符串对象
让我知道你的想法。字符串是不变的
阅读这里的讨论。我应该帮助你。
简言之。如果您看到字符串变量在代码中更改其值,您可以安全地假设创建了一个新对象
及
他们非常相似。当使用=时,未设置该值,但在同一引用下实际创建了一个新对象
编辑:
对于下层选民来说,答案是肯定的。将创建三个对象
创建文字abc。
创建与abc具有相同字符的字符串。
创建文字abcKDFghrtjk。
:
在运行时通过连接计算的字符串是新创建的,因此是不同的。
由常量表达式计算的字符串在编译时进行计算,然后将其视为文本
是的,三个。乍一看,您可能会想得更多,但编译器将组合字符串常量。因此编译器有效地将main的主体视为: 它还为类中的等效常量重用相同的字符串,因此相同的字符串也可以跨类使用,这意味着该代码中两次出现的abc文本只创建了一个abc 因此: 一个来自常量文本的abc 一个是abcKDFghrtjk,另一个是组合多个文本的常量结果 通过新字符串在第一行代码中显式创建为单独对象的一个abc
是的,您创建了3个字符串好的,谢谢,但是为什么像KDF、gh、rt、jk这样的中间对象没有存储在字符串池中呢?@Lovesh我给了您规范的链接,在这里定义了这种行为。您已经回答了自己的问题。你真的应该问为什么会发生这种行为,而不是什么都不问。好吧,谢谢@Xentros,我将跟随链接,这与给定代码中创建了多少字符串的问题有什么关系?此外,在第一条语句中,字符串池中已经创建了一些值,而s仅仅被分配了一个现有的引用。与不可变无关。创建的字符串数量与它们不可变的事实无关。当您使用=值未设置但实际创建了新对象时,如果该值是已在程序中使用的文本,则该语句是错误的。@BrandonIbbotson这就是为什么每当您看到字符串更改值时,我都会放一行。将创建一个新对象。我不知道为什么这个答案会完全误导我,先生,我想知道编译中是否只有字符串文字才是常量?@msagala:任何符合规范的常量值。这就是文本,也是规范有时调用成员变量的引用。
Compiled from "NumOfStringObject.java"
public class com.practise.general.NumOfStringObject extends java.lang.Object{
public com.practise.general.NumOfStringObject();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class java/lang/String
3: dup
4: ldc #3; //String abc
6: invokespecial #4; //Method java/lang/String."<init>":(Ljava/lang/Strin
g;)V
9: astore_1
10: ldc #3; //String abc
12: astore_2
13: ldc #5; //String abcKDFghrtjk
15: astore_3
16: return
}
String s = new String("some value");
String s = "some value";
"This is a string" // a string containing 16 characters
"This is a " + // actually a string-valued constant expression,
"two-line string" // formed from two string literals
String a = new String("abc");
String b = "abc";
String c = "abcKDFghrtjk";