有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在以下声明中有所不同

我无法识别以下Java中字符串声明的区别

假设我有两根绳子

String str1="one";
String str2="two";

两者的区别是什么

String str3=new String(str1+str2);

String str3=str1+str2;

在上述两个声明中,str3的内容将是onetwo

假设我创建了一个新字符串

String str4="onetwo";

那么在上述声明中

if(str4==str3) {
    System.out.println("This is not executed");
}

为什么str3str4不是指同一个对象


共 (4) 个答案

  1. # 1 楼答案

    因为Java中的String是不可变的,所以编译器将优化和重用String文本。因此

    String s1 = "one";
    String s2 = "one";
    s1 == s2; //true because the compiler will reuse the same String (with the same memory address) for the same string literal
    s1 == "o" + "ne"; //true because "Strings computed by constant expressions are computed at compile time and then treated as if they were literals"
    s3 = "o";
    s1 == s3 + "ne"; //false because the second string is created a run time and is therefore newly created
    

    有关参考资料,请参见http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5

  2. # 2 楼答案

    Java没有“这个变量如何得到值”的内存,因此,如果结果相同,那么使用哪种方法并不重要

    关于比较,如果将字符串与==进行比较,则是在比较内存中对象的地址,因为字符串不是基本数据类型,也不是值。你必须使用if(str4.equals(str3))

  3. # 3 楼答案

    字符串有点棘手,因为需要一些努力来共享它们的表示。而且它们是不可变的。 简单的回答是:除非你真的在低级别工作,否则你永远不应该使用“==”来比较字符串 即使它对你有用,但对你的队友来说,维持它也是一场噩梦

    要获得更长的答案和一点乐趣,请尝试以下方法:

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

    您会注意到,由于编译器努力共享,s1==s2。 然而s2!=s3,因为您明确要求输入一个新字符串。 你不太可能用它做任何聪明的事情,因为它是不变的

  4. # 4 楼答案

    str1 + str2对于非编译常量字符串,将编译成
    new StringBuilder(str1).append(str2).toString()。这个结果不会被放入字符串池,也不会从字符串池中获取(插入字符串的位置)

    "foo"+"bar"的情况下,情况就不同了,编译器知道使用哪些值,所以他可以将这个字符串连接一次,以避免在运行时使用它。这种字符串文字也将被拘留

    所以String str3 = str1+str2;

    String str3 = new StringBuilder(str1).append(str2).toString();
    

    String str3 = new String(str1+str2);相同

    String str3 = new String(new StringBuilder(str1).append(str2).toString());
    

    同样,作为方法(比如substringreplacetoString)的结果生成的字符串不会被占用
    这意味着您正在比较两个不同的实例(存储相同的字符),这就是为什么==返回false