1."=="
在java中,== 是直接比较两个对象的堆内存地址是否相等。 若相等,则代表两个引用指向同一个对象地址。
但我们分析下面这个情况:
例1:
int a = 10;
int b = 10;
System.out.println(a == b);
上面这个例子的结果为true。
那么,这是否意味着a和b指向同一个地址?
是的。
对于基本数据类型(byte,short,char,int,long,float,double,boolean),他们是作为常量在方法区中的常量池里以HashSet策略存储起来的。这就意味着无论我们定义int a=10,b=10还是c=10, abc中的引用都指向的同一个地址(存储int型数据10的地址)。因此,对于这些数据类型,我们就可以用==来比较他们是否相等。
另外,对于基本数据包装类型(Byte,Short,Character,Integer,Double,Float,Long,Boolean)除了Float和Double外,其他六种都是实现了常量池的。因此,对于这些数据类型,我们一般也可以用==来判断他们的大小。
但有一点需要特别注意:
例2:
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
Integer a = 128;
Integer b = 128;
System.out.println(a == b);
这个例子的结果为true,false。
这是因为Integer常量池的存储范围为[-128,127]。若初始的值大于这个范围,
则会在堆中创建一个新的Integer对象来保存这个值,所以a,b指向了两个不同的对象地址,从而导致了不相等。
2.equals方法
以下为Object类中的equals方法
显然Object类中的equals方法是直接由==来实现的。
众所周知,我们所有的类都直接或间接地继承自java.lang.Object类,因此我们可以通过重写equals方法来实现我们自己想要的比较方法。下面是eclipse为我们自动生成的equals方法 ↓
那为什么又要说==和equals方法的区别呢
原因是equals方法是可以由我们自己重写的。我们可以通过重写equals方法来实现我们自己想要的比较方法。
文章内容大部分为转述 在java中==和equals()的区别 这篇博客。
文中不当之处欢迎大佬们指教或提出异议。