Java比较String ==和equals() 解析

先看一个例子 equals() 比较String

public class TestString {

    public static void main(String[] args) {
        String strOne = "testString";
        String strTwo = "testString";
        System.out.println(strOne.equals(strTwo));
    }
}

结果为:true


再看 == 比较String

public class TestString {

    public static void main(String[] args) {
        String strOne = "testString";
        String strTwo= "testString";
        System.out.println(strOne == strTwo);
    }

}

结果为:true

分析原因:

String的equals()是比较字符串的内容。故第二个true很容易理解,因为strOne 和strTwo的内容显然相同。

==是比较内存地址的,第一个true说明strOne 和strTwo的地址相同。
为什么呢?

java有常量池,存储所有的字符串常量。

String strOne = “testString”
java首先会在常量池查找是否有 “testString”这个常量,发现没有,于是创建一个 “testString”,然后将其赋给strOne。


String strTwo= “String”;
java同样会在常量池中查找 “testString”,这次常量池中已经有strOne 创建的 “testString”,故不创建新的常量,将其地址赋给strTwo。

如此,strOne和strTwo便有了相同的地址。


用String() 来建立String对象

public class TestString {

    public static void main(String[] args) {
        String strOne = "testString";
        String strThree = new String("testString");
        System.out.println(strOne==strThree);
        System.out.println(strOne.equals(strThree));
    }
}

结果为:
false
true


public class TestString {

    public static void main(String[] args) {
        String strOne = new String("testString");
        String strThree = new String("testString");
        System.out.println(strOne == strThree);
        System.out.println(strOne.equals(strThree));
    }
}

结果相同:
false
true


分析原因:

而用new String(“testString”)创建的两个字符串,用equals()比较相等,用==比较则不相等。

为什么呢?

new String()每次会在堆中创建一个对象,每次创建的对象内存地址都不同,故==不相等。但字符串内容是相同的,故equals()相等。


再看关于普通类的

public class TestString {

    public static void main(String[] args) {
        Person perOne = new Person();
        Person perTwo = new Person();
        System.out.println(perOne == perTwo);
    }
}

class Person {

}

结果为flase


大家都知道,java中一般不用==比较两个对象,而是用equals()

给Person类一个域 id,复写equals()

public class TestString {

    public static void main(String[] args) {
        Person perOne = new Person(123);
        Person perTwo = new Person(123);
        System.out.println(perOne.equals(perTwo));
    }
}

class Person {
    private int id;

    Person(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Person)) {
            return false;
        }
        Person p = (Person) o;
        return p.id == id;
    }

}

结果为:true


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值