Java Strings输出混乱

时间:2014-04-16 16:33:44

标签: java string

我在接受采访时被问到这个问题,我说两者都会回复。 但是当我划过它时  一个是真的其他是假的

任何人都可以解释一下吗?

        String s1 = "H";
        String s2 = "e";
        String s3 = s1+s2;
        String s4 = "He";
        System.out.println(s3 == s4);//false

        String s5="h";
        String s6="h";
        System.out.println(s5 == s6);//true

6 个答案:

答案 0 :(得分:0)

需要使用

进行字符串比较

string.equals function ==比较引用。

由于“h”是常数

s5 == s6返回true

答案 1 :(得分:0)

我怀疑答案是正在使用字符串池,因为字符串经常被重用,它们有时被分配到同一块内存中。因此,在初始化时为s5s6分配相同的值将为它们分配相同的地址,而将字符串指定为另外两个字符串的串联将始终生成新地址。

答案 2 :(得分:0)

String s3 = s1+s2;

该字符串在运行时实现,并在堆中创建了该引用。 当我们用(+)运算符连接字符串时,JVM返回新的StringBuilder(string...).toString()

第二种情况

String s5="h";
String s6="h";

s5和s6都在编译时解析并指向相同的引用((常量池))。

有帮助:https://stackoverflow.com/a/19419194/1927832

答案 3 :(得分:0)

使用String.equals(String other)函数比较字符串,而不是==运算符。

该函数检查字符串的实际内容,==运算符检查对象的引用是否相等。请注意,字符串常量通常是" interned"这样两个具有相同值的常数实际上可以与==进行比较,但最好不要依赖它。

Java String.equals versus ==

答案 4 :(得分:0)

" =="如果对象地址相同,则operator返回true。在编译时,所有相同的 literal 字符串将减少为相同的String对象。因此:

String s1 = "A";
String s2 = "A"; // s1 == s2: points to the same address as s1

String s3 = "AA"
String s4 = s1+s2; // s3 != s4: the literal "AA" is a different object

String.equals()比较字符串值,而不是地址。

答案 5 :(得分:-1)

你不能在字符串上使用==,你需要使用String.equals函数。 你可以这样使用它:

        String s1 = "H";
        String s2 = "e";
        String s3 = s1+s2;
        String s4 = "He";
        System.out.println(s3.equals(s4));//false

        String s5="h";
        String s6="h";
        System.out.println(s5.equals(s6));//true