“==”操作符的应用场景:
(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方法是对内容的比较。”==”比较的是他们在内存中(栈)的存放地址。新闻热点
疑难解答