java 中 == 与 equals 的区别

   ==  比较两个操作数的值之间的关系

  equals是基类Object下的方法,用来比较两个对象的引用是否相等,即是否指向同一个对象(equals无法作用于基本数据类型)。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  1.java中有8中基本数据类型 byte、int(2 byte)、short(4 byte)、long(8 byte)、float(4 byte)、double(8 byte)、char(2 byte)、boolean。在基本数据类型中,变量直接存储的是 “值”。

int n = 10;
int m = 10;
System.out.println(n==m);          //返回true
System.out.println(n.equals(m)); //报错:基本数据类型无法使用equals

  n,m是基本数据类型,所以 == 比较的是n,m值本事,即 10 == 10。

  

  2.而对于非基本数据类型的变量,引用类型变量,如String,包装类等。(Java 语言为每一个内置数据类型提供了对应的包装类:Integer、Long、Byte、Double、Float、Short都是抽象类 Number 的子类。) 引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。所以 == 操作符比较的是两个地址,而String,包装类等很多对euqals进行了重写,使其比较的是数据所指向的地址中的内容。

Integer a = 127;
Integer b = 127;
System.out.println(a==b);        //返回 true :Java 会对 -127~127 的整数进行缓存,引用类型变量一般不用 == 进行判等
System.out.println(a.equals(b)); //返回 true

Integer c = 128; Integer d = 128; System.out.println(c==d); //返回 false System.out.println(c.equals(d)); //返回 true

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

总结:

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

          如果作用于引用类型的变量,则比较的是所指向的对象的地址。

2)对于equals,注意:equals方法不能作用于基本数据类型的变量

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

原文地址:https://www.cnblogs.com/Janine-S/p/8125396.html