java Equals 和“==”区别

Java 的equals和==区别

String  str1=new  String(“str”);
String str2=new  String (“str”);
System.out.println(str1==str2);   //false;
System.out.println( str1.equals(str2) );  //true;
String str3=”str1”;
String str4=”str1”;
System.out.println(st3==str4); //true
System.out.println( str3.equals(str4) );//true


 

可以发现:

equals无论是自动装箱来实例化还是用new 来实例化 返回结果都是true

而==则不一样,自动装箱返回的是true,用new 返回的是false

 

Equals 是用来判断两个对象的内容是否相等,而== 是判断两个对象的地址是否相等,是否指向同一对象。

 

在最初对所有类的基类中,equals方法定义如下:

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




可以看出这里定义的equals和==是等效的,但是String类对equals进行了重写

public boolean equals(Object anObject) {
    if(this == anObject) {
       return true;
    }
    if(anObject instanceof String) {
       String anotherString = (String)anObject;
       int n = count;
       if (n == anotherString.count) {
       char v1[] = value;
       char v2[] = anotherString.value;
       int i = offset;
       int j = anotherString.offset;
       while (n-- != 0) {
           if (v1[i++] != v2[j++])
           return false;
       }
       return true;
       }
    }
    return false;
    }


Equals 具有以下性质:

1.      自反性,对于任意引用值x,x.equals(x) 的返回值一定是true

2.      对称性,对于任何引用值 x,y, 当且仅当 y.equals(x)=true 时,x.equals(y)=true;

3.      传递性,若x.equals(y)=true ,y.equals(z)=true;则x.equals(z)=true

4.      一致性,如果参与比较的对象没有任何改变,则对象比较的结果也不应该改变

5.      非空性,对于任意引用值x, x.equals(null)的返回值一定是false


补充:

Integer 类的情况

inti=0;
Integerj = newInteger(0);
System.out.println(i==j);//true
System.out.println(j.equals(i));//true


基本类型与 Integer 的比较, 会自动拆箱成 int 类型,然后比较的是值。因此返回真;

j.equals(i) ,调用 equals 方法后,这个 会自动装箱成 Integer 类型,然后再比较值,所以也返回真;

 

一般说来,如果是两个Integer类型进行==比较,就是比较两个Integer对象的地址。

 

但是有一点需要注意的是在-128127这个区间,如果创建Integer对象的时候(1Integer i = 1; 2 Integer i = Integer.valueOf(1);如果是这两种情况创建出来的对象,那么其实只会创建一个对象,这些对象已经缓存在一个叫做IntegerCache里面了,所以==比较是相等的。

如果不在-128127这个区间,不管是通过什么方式创建出来的对象,==永远是false,也就是说他们的地址永远不会相等。


String s1=new String("123");
String s2=new String("123");

out.println(s1==s2);//false
out.println(s1.equals(s2));//true

String s3="134";
String s4="134";

out.println(s3==s4);//true
out.println(s3.equals(s4));//true

String s5=new String("234");
String s6="234";
out.println(s5==s6);//false
out.println(s5.equals(s6));//true

int i1=5;
int i2=5;
out.println(i1==i2);//true
//out.println(i1.equals(i2)); //Cannot invoke equals(int) on the primitive type int

Integer i3=new Integer(5);
out.println(i1==i3);//true;
out.println(i3.equals(i1));//true;

Integer i4=new Integer(5);
out.println(i3==i4);//false;
out.println(i3.equals(i4));//true;

int i6=128;
int i7=128;
out.println(i6==i7);//true

Integer i8=new Integer(128);
out.println(i7==i8);//true
out.println(i8.equals(i7));//true

Integer i9=new Integer(128);
out.println(i8==i9);//false
out.println(i8.equals(i9));//true



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值