Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在以下代码中创建的字符串对象的总数?_Java_String - Fatal编程技术网

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";