10
    public static void main(String[] args){
        one();
        two();
        three();
    }

    public static void one() {
        String s1 = "hill5";
        String s2 = "hill" + 5;
        System.out.println(s1==s2);
    }

    public static void two() {
        String s1 = "hill5";
        int i =5;
        String s2 = "hill" + i;
        System.out.println(s1==s2);
    }

    public static void three() {
        String s1 = "hill5";
        String s2 = "hill" + s1.length();
        System.out.println(s1==s2);
    }

输出是

true 
false 
false 

字符串文字使用实习过程,那么为什么two()three()是错误的。我可以理解three()two()不清楚。但需要对这两种情况进行适当的解释。

有人可以解释一下正确的理由吗?

4

2 回答 2

14

在 2 和 3 的情况下,编译器无法计算 String 的值,因为hill + i是运行时语句,对于s1.length()

在这里阅读我问过同样的情况 -链接

像这样认为String s1 and s2正在使用编译时常量,s1="hill5"并且s2="hill" + 5请记住,分配为文字的字符串是常量,它的状态不能被修改,因为字符串是不可变的

所以在编译时,编译器说“哦,是的,它们被计算为相同的值,我必须为 s1 和 s2 分配相同的引用”。

但是在方法two()and的情况下three(),编译器说“我不知道,可能 i 的值可以随时更改,或者s1.length() 随时更改”,这是运行时的事情,所以编译器不会将two()andthree()方法的 s2 放入池中,

因此,它们是错误的,因为在运行时,一旦正确更改就会创建新对象!

于 2013-05-27T10:31:34.463 回答
1

带有编译时常量表达式的字符串将被放入字符串池中。主要条件是编译时常量表达式。如果您在方法中将局部变量设为final,two()那么two()也会打印true

public static void two() {
    String s1 = "hill5";
    final int i =5;
    String s2 = "hill" + i;
    System.out.println(s1==s2);
}

输出:

true
于 2018-07-04T09:37:23.640 回答