Java中 == 和equals的区别

java中的数据类型可分为2种:
1.基本数据类型
基本数据类型之间的比较用==,比较的是它们的数值。
2.引用数据类型
(1)引用数据类型用==比较,比较的是内存中的存放地址。所以,如果2个对象指向内存中的同一块区域,比较结果为true,否则为false。
(2)Java中所有类都继承自Object这个基类,在Object基类中有一个equals方法public boolean equals(Object o){
return this==o;
}

可以看出,在Object基类中equals方法本质上还是和==一样,但是在有些类库中重写了基类中的equals方法,如String,Integer,Date类等,这些类中的equals方法有其自身的实现。
所以,引用类型用equals比较,如果没有重写基类中的equals方法,比较结果还是和(==)比较结果一样,如果重写了equals方法,如String类:

 1     public boolean equals(Object anObject) {
 2         if (this == anObject) {
 3             return true;
 4         }
 5         if (anObject instanceof String) {
 6             String anotherString = (String)anObject;
 7             int n = value.length;
 8             if (n == anotherString.value.length) {
 9                 char v1[] = value;
10                 char v2[] = anotherString.value;
11                 int i = 0;
12                 while (n-- != 0) {
13                     if (v1[i] != v2[i])
14                         return false;
15                     i++;
16                 }
17                 return true;
18             }
19         }
20         return false;
21     }

从String类重写equals方法来看,String类的equals方法比较的是两个字符串的内容。

下面通过实例来看看String类的比较:

public class TestString {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
    }
}

运行结果:
true
true
字符串缓冲池:程序在运行的时候会创建一个字符串缓冲池,当使用 s2 = “abc”这样的表达式创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象。s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1,将s2引用s1所引用的对象”abc”.
故s1,s2指向同一个内存区域,所以==和equals比较结果都是true.

修改程序:

public class TestString {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = new String("abc");
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
    }
}

运行结果:
false
true
s1被创建的时候,同样放入缓冲池,在创建s2的时候,明确告诉程序:“要创建一个新的对象,不要旧的”,于是,新的“abc”对象被创建在内存中,他们的值相同,但是内存地址不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值