java 双等号(==) 与equals方法的介绍和区别
1.基本数据类型与equals方法
- == 用于比较基本数据类型时,比较的是值
- ==用于比较引用数据类型时,比较的是地址
- equals方法在Object类中比较的也是地址,因为在低层也是使用==进行比较
- String类调用equals方法比较的内容,因为String类对equals方法进行了重写,改为了比较字符串的内容
package com.qfedu.test2;
/*** == 与 equals方法区别* @author **/
public class Person {private String name;private String idCard;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getIdCard() {return idCard;}public void setIdCard(String idCard) {this.idCard = idCard;}public Person(String name, String idCard) {this.name = name;this.idCard = idCard;}public Person() {}public static void main(String[] args) {Person p1 = new Person("张三","abcd");Person p2 = new Person("张三","abc");//== 比较的是地址 falseSystem.out.println(p1 == p2);//Object类中equals方法低层使用的也是 == 所以比较的也是地址 打印false System.out.println(p1.equals(p2));System.out.println("======================");//String 也是一个类 可以创建对象并赋值String str1 = new String("abc");String str2 = new String("abc");//==比较的是地址 falseSystem.out.println(str1 == str2);//String 中重写的equals方法 比较的是内容 输出trueSystem.out.println(str1.equals(str2));}}
2.String类中:
String 对象直接使用等号赋值,会将值存储在方法区的字符串常量池中
String使用等号直接赋值时,在存放之前,会先检查常量池中是否有相同的字符串内容,如果存在,直接使用已存在字符串内容,如果不存在,将以一个新的地址存放在常量中
注意:如果通过new对象进行赋值,每个对象都会是一个新的地址
public class Test1 {public static void main(String[] args) {//String 在方法区有一个存储字符串的常量池,存放之前会检查常量池是否存在,//存在的话直接使用,所以地址相同String str1 = "121";String str2 = "121";//new 对象直接在堆中 每次创建都会产生一个地址String str3 = new String("121");String str4 = new String("121");System.out.println(str1 == str2);System.out.println(str3 == str4);System.out.println(str2 == str3);}
}
3.整数包装类中
- 数值包装类,取值在byte(-128~127)之间,直接使用等号(=)赋值时,多个对象比较,结果为true,超过范围为false
- char类型也遵循这个规则
public class Test1 {public static void main(String[] args) {Integer i1 = 12;Integer i2 = 12;System.out.println(i1==i2);//true//浮点型不适用Double d1 = 12D;Double d2 = 12D;System.out.println(d1 == d2);//falseLong l1 = 123L;Long l2 = 123L;System.out.println(l1 == l2);//true}
}