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_Concatenation - Fatal编程技术网

两个Java字符串的串联

两个Java字符串的串联,java,string,concatenation,Java,String,Concatenation,当我编写以下代码时 int a = "Java"; java编译器显示以下错误: 无法从字符串转换为int 因此,常量Java被视为从 Stringclass -在“之间包含的每个字符列表都被视为从String类派生的对象,这是真的吗 当我尝试连接两个字符串时,我使用了两个 以下例子: String ch1 = "Java " ; String ch2 = "is cool"; String ch3 = ch1 + ch2; 在我对编译的类使用命令javap-c之后,我发现 编译器使用Str

当我编写以下代码时

int a = "Java";
java编译器显示以下错误:

无法从字符串转换为int

因此,常量
Java
被视为从
String
class

-
之间包含的每个字符列表都被视为从String类派生的对象,这是真的吗

  • 当我尝试连接两个字符串时,我使用了两个 以下例子:

    String ch1 = "Java " ;
    String ch2 = "is cool";
    String ch3 = ch1 + ch2;
    
    在我对编译的类使用命令
    javap-c
    之后,我发现 编译器使用
    StringBuilder
    的实例来附加 两条线

    但另一个例子是:

    String ch = "Java " + "is cool"; 
    
    尽管两个常量“Java”和“is cool”都是从
    String
    类,编译器不使用
    StringBuilder的实例
    附加两个字符串

    -那么第二个示例中使用的方法是什么


  • 不确定你的第二个问题是什么,但对于你的第一个问题: “Java”是一个字符串,您试图将其存储为int类型。它不是一个整数。变量a的类型必须为字符串

       String a = "Java ";
    

    在第一个示例中,您创建了两个字符串vars,ch1和ch2,可以在代码的其他部分中使用,因此。。。当您初始化ch3时,将在内存中创建一个新字符串,其中包含两个变量的内容(这里是StringBuilder进行工作的地方)。这是必需的,因为您可以更改ch2的值,而ch3不会更改

    在第二个示例中,两个字符串都是最终的,在代码中不再使用,因此Java只需创建一个唯一的字符串“Java很酷”


    我不知道我是否解释得很好。

    当你做下一行时

    String ch1 = "Java " ;
    String ch2 = "is cool";
    String ch3 = ch1 + ch2;
    
    ch1和ch2都是文本,编译器将使用StringBuilder创建字符串实例。在早期(当编译器不够聪明,无法做到这一点时),concat操作每次执行都会浪费内存

    但是当你用这个的时候

    String ch = "Java " + "is cool";
    
    编译器理解字符串文字“Java”+“is cool”不能在任何时候修改。所以编译器会把它翻译成

    String ch = "Java is cool";
    
    作为字节码。只有一个字符串文字将创建运行时。

    “+”每次连接某个对象时都会创建一个新的字符串对象,但在编译时进行连接时除外

    虽然这不是一个有名气的来源,但从我的课本上记得的情况来看,这听起来是正确的。因此,基本上,将其应用于代码:

    String ch = "Java " + "is cool";
    
    将在编译时处理,因为您已经定义了两个常量并将它们连接在一起,这意味着结果实际上也是一个常量,因此可以这样处理并在编译时计算。如果您编译了该代码,然后进行反编译,以查看该语句的读取方式,这将是一件有趣的事情,我想它可能会读:

    String ch = "Java is cool";
    
    至于另一项声明:

    String ch1 = "Java " ;
    String ch2 = "is cool";
    String ch3 = ch1 + ch2;
    
    由于ch3是从ch1和ch2计算出来的,因此它是在运行时完成的,因为ch1和ch2是变量而不是常量


    至于你的第一个问题,我找不到任何确切的引用,但从我记忆中的是,“”表示字符串,就像“”表示字符一样。我不太清楚你想用那个语句做什么,但我可以想象你可以把你的字符串转换成一个字符数组,然后把它转换成一个整数数组。

    我认为与字符串池有关的东西。我真正的问题是为什么java编译器不将
    StringBuilder
    string ch=“java”+“很酷”?这在我链接的问题中得到了回答。我会读到是的,我会显式地执行错误检查常量“Java”的性质,我仍然有点不清楚,但是是的,一旦你输入“某物”,它就会认为某物是字符串类型。不过,您始终可以声明一个单独的整数,并使用integer.parseInt()从该字符串中获取整数。我真正的问题是,为什么java编译器不将
    StringBuilder
    string ch=“java”+“很酷”?谢谢,你的回答解释我第二个问题。但在我的第一部分中,您能否确认“包含在
    之间的每个字符列表是否被认为是从String类派生的对象?”是否正确?请仔细阅读此答案。“”之间的字符序列在Java中被视为字符串文字。这些文本存储在JVM控制的字符串池中。所以,如果你在多个地方有“Java”。您只能在“字符串实例”中使用值(“Java”)并通过JVM维护。谢谢您的回答,这非常有帮助。@NarutoBijuMode很高兴我能提供帮助。我不确定那里的一切是否都很清楚。事实上,我喜欢没有太多技术性的答案。谢谢:)