java中的“==”和equals()

在Object类中实现的equals()方法是与 == 等价的,都是比较的地址;
当没有重写equals()方法时,默认调用的就是Object类中的equals()方法;

在这里我们说一下
== 和重写后的equals()的不同之处:

“==”:

  • 在比较基本数据类型的时候,比较的就是两个数的值是否相等
  • 但是在比较引用类型时候,比较的是两个引用类型的对象的地址是否相等

equals():

  • 重写后的equals()方法比较的是内容是否相等

Integer中的==和equals():
Integer是一个包装类,包装类是基本数据类型与引用类型之间的桥梁;

Integer初始化有两种方式,一种是显式装箱(调用构造方法)例如:Integer num = new Integer(55);一种是自动装箱(底层调用java.Integer.valueOf()方法)例如:Integer num = 55;自动装箱的这种方式在存储是会有一个存储的栈,在-128~12之间的数在存储时,先会在这个栈中查询有没有该数,有的话,直接拿来用而不会再存储一遍,没有的时候才会存储到栈里(Interger对象是在IntegerCache.cache产生,会复用已有的对象),超过那个范围的数在存储时会存储到堆上,new一个对象出来。

==:

当**Intager类与基本数据类型相比较**的时候:

包装类会自动拆箱为基本数据类型,再与基本数据类型进行比较;

当**Integer与Integer相比较**时:

在-128~127之间的数比较时,比较的就是数值,因为它们相同数的地址都是相同的,二在这个范围之外的数进行比较的时候,比较的就是地址了,这时候的地址是new在堆上的对象地址的比较;

equals():
比较的是内容是否相同,即只比较数字是否相同;

例如:

   public class Text {
    public static void main(String[] args) {
    Integer a = 127;
    Integer b =127;
    Integer e = 128;
    Integer e2 = 128;
    Integer a1 = new Integer(127);
    Integer  a3 = new Integer(127);
    int c = 127;
    int d =127;
    System.out.println(a == b);//true
    System.out.println(a == c);//true
    System.out.println(a == a1);//false
    System.out.println(a1 == a3);//false
    System.out.println(e == e2);//false
    System.out.println(a.equals(a1));//true
    System.out.println(c == d);//true
}
}

String类中的== 和equals():
String类在设计的时候采用了共享的设计模式,即JVM底层会自动维护一个字符串对象池,如果采用直接赋值的方式进行String类的实例化时,这时候的字符串内容将保存在这个对象池中,如果下次依然使用直接赋值的模式,会先在对象池中查找,如果有的话就直接进行引用,没有的话,会将新的字符串保存在对象池中供以后使用;而如果采用构造方法实例化的时候,这时候的字符串会保存在堆上,不会入池,除非人为的将它入池;

== 方法比较的是对象的地址,常量池中的字符串可以用该方法直接比较;
equals()方法比较的是字符串的内容;
例如:

public class Text {
  public static void main(String[] args) {
    String  a = "hello";
    String a1 = "hello";
    String  b = new String("hello");
    String b2 = new String("hello");
    String  c = "hi";
    System.out.println(a==a1);//true
    System.out.println(a==b);//false
    System.out.println(a.equals(b));//true
    System.out.println(b==b2);//false
    System.out.println(b.equals(b2));//true
    System.out.println(a==c);//false
    System.out.println(a.equals(c));//false
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值