工作8年,一直很浮躁,没深入了解Java的基础,今天才发现自己一直以来的错误认知。
1.==一般用于基本数据类型,比较它们存储的值是否相等,也可用于比较引用类型,比较的是它们所指向对象的地址值(是否是同一个对象)
2.equals只能用于比较引用类型(对象),不能用于比较基本数据类型
3.最大的误区:对于引用类型,==和最初的Object中的equals实际上都是比较两个引用类型变量所指向对象的地址值,然而开发当中常用的equals是String类中重写过的方法,比较的是String的值,如果是自定义对象,则一般是对比这两对象是否相同,有其他需求才会在对象内重写equals
Object中的equals:
public boolean equals(Object obj) {
return (this == obj);
}
然后是复制别人的栗子:
public static void main(String[] args) {
//基本数据类型的比较
int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); //true
//引用数据类型的比较
//String类(重写了equals方法)中==与equals的比较
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2); //true,比较地址值:内容相同,因为常量池中只有一个“hello”,所以它们的地址值相同
System.out.println(s1.equals(s2));//true,比较内容:内容相同,因为常量池中只有一个“hello”,所以它们的地址值相同
System.out.println(s1.equals("hello")); //true
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s3 == s4); //false,比较地址值:s3和s4在堆内存中的地址值不同
System.out.println(s3.equals(s4)); //true,比较内容:内容相同
//没有重写equals方法的类中==与equals的比较
People p1 = new People();
People p2 = new People();
People p = p2;
System.out.println(p1);//People@135fbaa4
System.out.println(p2);//People@45ee12a7
System.out.println(p); //People@45ee12a7
System.out.println(p1.equals(p2)); //false,p1和p2的地址值不同
System.out.println(p.equals(p2)); //true,p和p2的地址值相同
}