1

任何人都可以直接使用代码及其输出吗?

public class HelloWorld {
  public static void main(String[] args) {
    String s1 = "Hello World";
    String s6 = "Hello" + " World";
    String s7 = "Hello";
    String s8 = " World";
    String s9 = s7 + s8;
    String s10 = s7 + " World";
    System.out.println(s1==s6);
    System.out.println(s1==s9);
    System.out.println(s1==s10);
    System.out.println(s9==s10);
  }
}

输出 :

true
false
false
false

我知道这s1是在字符串常量池中创建的。我想知道如何创建s6s9以及s10由于使用了连接运算符。

4

4 回答 4

6

在编译时进行了很多优化。因此,如果您在编译后查看反编译的代码,您会看到:

    String s1 = "Hello World";
    String s6 = "Hello World";
    String s7 = "Hello";
    String s8 = " World";
    String s9 = (new StringBuilder(String.valueOf(s7))).append(s8).toString();
    String s10 = (new StringBuilder(String.valueOf(s7))).append(" World").toString();
    System.out.println(s1 == s6);
    System.out.println(s1 == s9);
    System.out.println(s1 == s10);
    System.out.println(s9 == s10);

它很容易解释。所以它是幕后的编译器,他为你做了很多工作。

当我们连接字符串文字时,它用单个文字替换它,当我们使用变量连接时,它使用 StringBuilder。

于 2013-04-30T04:34:08.563 回答
2

编译器对此进行了优化:

String s6 = "Hello" + " World";

对此:

String s6 = "Hello World";

所以s1s6引用同一个对象。您可能希望编译器对其他字符串进行类似的编译时优化。如果您声明s7and s8as final,它将:

public class HelloWorld {
  public static void main(String[] args) {
    String s1 = "Hello World";
    String s6 = "Hello" + " World";
    final String s7 = "Hello";
    final String s8 = " World";
    String s9 = s7 + s8;
    String s10 = s7 + " World";
    System.out.println(s1==s6);
    System.out.println(s1==s9);
    System.out.println(s1==s10);
    System.out.println(s9==s10);
  }
}

产生:

真的
真的
真的
真的

它归结为编译器愿意连接编译时常量。它不会进行静态代码分析来确定这一点,s7并且s8在您声明s9s10. 将它们声明为final提供了静态代码分析理论上可以提供的信息。

于 2013-04-30T04:43:40.283 回答
0

字符串不能使用==运算符进行比较,而应使用compareTo()(or compareToIgnoreCase()) 方法。

...
String str01 = "abc";
...
System.out.println(str01.compareTo("abc") == 0); // Will print 'true'
System.out.println(str01.compareTo("a" + "b" + "c") == 0); // Will also print 'true'
System.out.println(str01.compareTo("ABC") == 0); // Will print 'false'

'compareTo()' 将返回一个整数,如果字符串相等,则该整数为零,或者在任何其他情况下返回一个不为零的数字。检查:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String)

于 2013-04-30T04:35:57.437 回答
0

他们都在说“Hello World”

s6 = 要组合的两个字符串“Hello”和“World”。

连接的使用是在 Java 编程语言中将字符串相加。这样您就可以拥有多行,并在一堆行中移动文本。

例如:

  System.out.println("I enjoy" + "This nice " + "weather!");

会产生“我喜欢这个好天气!

之所以没有空格,是因为它连接的时候,什么都不做,只是忽略了'+'号,把“”放在一起组成一个大句子,或者String。

对于 s6,它是说添加“Hello”和“World”这 2 个字符串,这意味着它最终将作为“Hello World”结束。

对于 s9,它采用 String vars s7 & s8 并将它们连接在一起。因此,当运行时,java 会读取 s7 并说“好的,s7 保存字符串“Hello”,s8 保存字符串“World”,我会将它们放在一起创建“Hello World”。

对于 s10 来说,这只是同样的事情。它需要 s7 字符串并添加到它的末尾“世界”。

希望这可以帮助

于 2013-04-30T04:36:30.787 回答