IT序号网

Java中字符串比较的问题知识解答

developer 2021年05月25日 编程语言 143 0
package com.hxl; 
 
import java.util.Scanner; 
 
public class Test { 
 
    public static void main(String[] args) { 
        String s1 = "Hello"; 
        String s2 = "World"; 
        String s3 = "HelloWorld"; 
        System.out.println(s3 == (s1 + s2)); 
    } 
 
}

【结果】false

package com.hxl; 
 
import java.util.Scanner; 
 
public class Test { 
 
    public static void main(String[] args) { 
        String s1 = "Hello"; 
        String s2 = "World"; 
        String s3 = "HelloWorld"; 
        System.out.println((s1 + s2).hashCode()); 
        System.out.println(s3.hashCode()); 
    } 
 
}

【结果】

439329280
439329280

package com.hxl; 
 
public class Test { 
    public static void main(String[] args) { 
        String s1 = "length: 10"; 
        String s2 = "length: " + s1.length(); 
        String s3 = "length: " + 10; 
        System.out.println(s1); 
        System.out.println(s2); 
        System.out.println(s3); 
        System.out.println(s1.hashCode()); 
        System.out.println(s2.hashCode()); 
        System.out.println(s3.hashCode()); 
        System.out.println(s1 == s2); 
        System.out.println(s1 == s3); 
    } 
}

【结果】

length: 10
length: 10
length: 10
1160065963
1160065963
1160065963
false
true

【原因】

       首先要知道==比较的是引用,equals比较的是内容。其次还要知道引用放置在栈内,内容放置在堆内。再其次要知道这里没有使用new所以所有数值都是要进入常量池进行比较。当程序加载的时候常量池中存储的有length: 10、length:、s1.length()、10,其中常量10和length:是没有任何引用指向它们的。而length: 10是有s1引用指向它的。s1.length()也是有引用指向的,只不过没有体现出来,或者说s1.length()可以看成是int i=10;或者int i=s1.length();所以这里的s1.length()这个常量10是有引用的指向的一个常量,所以跟上面那个没有引用指向的10是有区别的,而==恰恰是比较引用的,既然引用都不同了,拼接后的引用s2自然跟s1和s3都不一样。所以s2无论是跟s1比较还是跟s3比较结果都是false。

----------------------------------------------------------------------------------------------------

       当定义s3的时候系统会自动把"length: " + 10 转换成 “length: 10” ,让后看看栈空间里面有没有这个值存在,如果有的话就不会在划分空间来存放,直接引用已经存在的值,所以s1跟s3同时引用的都是"length: 10",但s2里面有s1.length()这个是需要通过计算的,每次计算出来的临时的值都会存放在堆空间里面,所以他们引用的地址是不同的。

 ------------------------------------------------------------------------------------------------------------------------

       s1+s2与"Hello"+"World"是不同的,两个变量做运算结果的类型是未知的,而常量运算结果的类型是可以预测的。

【总结】

字符串如果是变量相加,先在栈内存开辟空间,再进行拼接。

字符串如果是常量相加,先拼接,然后在方法区中的常量池中寻找,如果有就直接返回引用。否则,在此处创建并返回引用。


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java中用Scanner扫描控制台输入时的一个小问题知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。