Java String literals concatenation

依然范特西╮ 提交于 2019-11-26 09:12:48

问题


    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);
    }

Output is

true 
false 
false 

String literals use interning process,then why two() and three() is false.I can understand in case of three() but two() is not clear.but need proper explanation for both cases.

Can someone please explain proper reason?


回答1:


In case of 2 and 3 , Compiler cannot calculate the value of String , since hill + i is a runtime statement , same for s1.length()

read here which i asked the same case - link

Think like this the String s1 and s2 are using compile time constant , s1="hill5" and s2="hill" + 5 , remember , string assigned as a literal is constant , its state cannot be modified , as String are immutable.

So at Compile time , compiler says "oh yeah , they are calculated as same value , i must assign the same reference to s1 and s2".

But in case of method two() and three() , compiler says " i dont know ,may be value of i can be changed any time , or s1.length() changes any time " , its a runtime thing , so compiler doesn't put s2 of two() and three() method in pool ,

Hence , they are false because at runtime , new object is created as soon it get changed right !!




回答2:


String with compile time constant expression will be put on String pool. The main condition is compile time constant expression. If you make local variable final in method two() then two() will also print true

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

Output:

true


来源:https://stackoverflow.com/questions/16771122/java-string-literals-concatenation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!