浅谈equals和==的关系和区别

浅谈equals和==的关系和区别

1.在java的基本类型中,==用来比较值。(这也是我们最常用的)

普通类型用==比较即可

int ia=3;
int ib=3;
boolean g=(ia==ib);
System.out.println(g);

true

2.在普通类的对象引用,如果该类不重写equals方法,==和equal具有相同作用。

都用于比较的是对象的内存地址

//Objec类中,equal方法的定义
public boolean equals(Object obj) { 
    return (this == obj);
}

3.在String类的对象引用比较,==用于比较对象引用内存和equals用于比较对象的值

想在String中比较两个对象值是否相等,使用equals

下面使用==以及equals对String实例进行比较。可得equals是比较值,==用于比较对象引用指向的内存
public class StringApi {
    public static void main(String[] args) {
        //通过构造方法创建String实例
        String string1=new String("cde");
        String string2=new String("cde");
        //通过直接给String对象赋值,等价于String(char[] c);
        String string3="cde";
        String string4="cde";
        //通过把旧实例赋值给实例
        String string5=string1;
        String string6=string3;

        System.out.println(string1==string2);           //false
        System.out.println(string1==string3);           //false
        System.out.println(string1==string5);           //true
        System.out.println(string2==string5);           //false
        System.out.println(string4==string6);           //true
        System.out.println();
        System.out.println(string1.equals(string2));    //true
        System.out.println(string1.equals(string3));    //true
        System.out.println(string1.equals(string5));    //true

    }
}

String类中重写了equals方法,用于比较字符串的值
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    //判断传入的对象是否String类实例或者子类实例
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        //判断传入对象与调用对象的内容是否一致
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
对于用==时,string1==string5比较结果相同的浅析

因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式,每当生成一个新内容的字符串时,他们都被添加到一 个共享池中,当第二次再次生成同样内容的字符串实例时,就共享此对象,而不是创建一个新对象,这样的做法仅仅适合于通过=符号进行的初始化。因此它们指向的地址是一致的,因此它们的比较出现结果相同

Java中,“==”运算符用来比较两个引用以查看它们是否指向同一个内存对象。而对于String实例,运行时状态会尽可能地确保任意两个具有相同字符信息的String字面值指向同一个内部对象。此过程称为驻留(interning),但是它并不有助于每个String的比较。一个原因是垃圾收集器线程删除了驻留值,另一个原因是String所在的位置可能被一个由String构造函数创建的新实例占用。如果是这样,“==”将总是返回false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值