Java中 “==”和equals()的区别

Java中 “==” 和equals()的区别

"=="运算符:可以使用在基本数据类型变量和引用数据类型变量中

如果比较的是基本数据类型,则比较两个变量保存的数据是否相等(不一定类型要相同)

代码举例

public class EqualsTest {
    public static void main(String[] args) {
		//声明两个int型变量和一个double型变量
        int i = 10; 
        int j = 10;
        double d = 10.0;
        //比较并输出结果
        System.out.println(i == j);//True
        System.out.println(i == d);//True
    }
}

这里 ij 两个int型变量比较很明显是True,而 id 的时候就涉及到自动类型提升的问题了

id 比较的时候int型的 i 会自动提升为double型变成10.0,这时他们两个比较结果也自然是True。

关于boolean型和char型

		//boolean b = true;
        //System.out.println(i == b );//编译不通过
        char c  = 10;
        System.out.println(i == c);//True
        char c1 = 'A';
        char c2 = 65;
        System.out.println(c1 == c2);//True

boolean 类型是不能用在 "=="运算符中的,所以编译不能通过

而在 char 型的 c 的比较中,因为char类型的字符都对应有ASCII码值,所以这里的10和int型的10相同,所以返回True

有了上一个的铺垫 c1c2 也很容易理解了, 字符 A 在 ASCII码中对应的是65,所以和 c2 的65比较结果也是True


如果比较的是引用数据类型变量,则比较两个对象的地址值是否相同,即两个的引用是否指向同一对象的实体

代码举例

		//声明两个相同值得String类型的变量
		String str1 = new String("test");
        String str2 = new String("test");
        //比较并输出
        System.out.println(str1 == str2);//false

结果很简单粗暴,就是false,因为虽然这两个变量的值相同,但是他们是两个不同的对象,在内存中都有属于自己的独立空间,地址值不相同,所以false.


equals()方法:只可以比较引用数据类型变量。

equals()方法实际上是所有类的根父类object类中的方法,所以我们用的equals()其实就是调用父类的方法而已。让我们到object类中看看它的具体实现。

public boolean equals(Object obj) {
        return (this == obj);
    }

从中我们可以看出,object类中的equals()方法居然就是直接用了 “==”,即比较两个引用数据类型变量的地址值,那我们就参照上面的代码运行试试看

		//声明两个相同值得String类型的变量
		String str1 = new String("test");
        String str2 = new String("test");
        //比较并输出
        System.out.println(str1.equals(str2));
        //输出true

但是!我们会很奇怪的发现输出的居然是true?这是为什么呢?
当我们查看String类里的equals()方法发现原来是String类重写了equals()方法

@Override
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (!COMPACT_STRINGS || this.coder == aString.coder) {
                return StringLatin1.equals(value, aString.value);
            }
        }
        return false;
    }

可以看到String类的equals()方法是通过一个个的比较内容来比较的。Data、file、包装类等一些类其实都是有自己重写过后的equals()方法来实现他们所需要的比较效果的。

而当我们自己创建一个类时,一般没写equals()方法,会默认调用object()类的,它也只是通过 **"=="**来比较罢了,所以如果我们想要equals()达到我们自己想要的效果的话就得自己重写它。

总结

“==”运算符

  1. 可以对基本数据类型和引用数据类型使用(boolean型除外)。
  2. 比较对象是基本数据类型时,比较两者保存的数据是否相同(char型比较ASCII码)。
  3. 比较对象时引用数据类型时,如果没有重写,默认使用 “==” 比较;重写方法后,可以实现自己所想要达到的效果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值