首页 > 学院 > 开发设计 > 正文

equals和"=="的区别

2019-11-06 06:23:40
字体:
来源:转载
供稿:网友

“==”操作符的应用场景:

(1) 基本数据类型的比较;(byte,short,char,int,long,float,double,boolean)(2) 判断引用是否指向堆内存的同一块地址。(是对值的比较,引用数类型比较地址值,基本数据类型直接比较数值)

equals的应用场景:

- 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址; - 如果对equals方法进行了重写,则比较的是对象,即堆中的内容。例如String、FIle、包装类、Date等类型对equals方法进行了重写的话,比较的是所指向的对象的内容。用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,其返回值为布尔类型。(没有重写比较地址。重写比较对象)

Object类源码中的equals方法:

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

String类源码中的equals方法:

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

Integer类源码中的equals方法:

public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }

Boolean类源码中的equals方法:

public boolean equals(Object obj) { if (obj instanceof Boolean) { return value == ((Boolean)obj).booleanValue(); } return false; }

测试String类:

public class TestString { public static void main(String[] args) { //对象不同,内容相同,"=="返回false,equals返回true。 String s1 = new String("test"); String s2 = new String("test"); //值相同,则对象相同,"=="和equals返回值相同 String s3 ="test"; String s4 = "test"; System.out.PRintln(s1==s2); //false System.out.println(s1.equals(s2)); //true System.out.println(s3==s4); //true System.out.println(s3.equals(s4)); //true }}

比较后发现,

Object的equals方法本质也是用”==”进行比较的,所以比较后的结果跟”==”的结果相同。而在String、Integer、Boolean等的类中,equals方法都有其各自的实现,都涉及到value的比较(即内容的比较)。故在这些类中,equals方法是对内容的比较。”==”比较的是他们在内存中(栈)的存放地址。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表