一、适用数据类型对比
“==” | equals() | |
适用数据类型 | 基本数据类型: 整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte) 浮点型:float(4 byte), double(8 byte) 字符型: char(2 byte) 布尔型: boolean | 引用数据类型 |
比较什么 | 比较值是否相等(因为基本数据类型的变量存储值本身,非地址,即非指针 引用类型变量存储地址,即指针,引用类型用“==”比较的是变量存储的地址) | 比较引用是否相等 |
equals() | String类、Date类等 | 其他类 |
是否重写 | 是 | 否 |
重写后差异 | 比较引用中的值是否相等 | 比较引用是否相等 |
二、String字符串声明两种方式和差异
str1 =“ Hello”; | str2 =“ Hello”; | String str3 = new String(“ Hello”); | |
创建过程差异: | JVM会直接在一个单独的内存块(称为String常量池)中创建具有给定值的String对象 | JVM会验证String常量池中是否存在具有相同值的String对象,如果不是,JVM会创建新对象,如果是,不创建新对象,而是将现有对象的引用分配给新变量。 | 使用new关键字,将创建具有给定值的新对象于内存中,而与String常量池的内容无关。 |
三、测试运行比较
public class Test {
public static void main(String[] args) {
String str1 = "Hello";//直接赋值
String str2 = new String("Hello");//构造方法赋值
String str3 = str2;//引用传递
String str4 = null;
System.out.println(str1==str2);//false
System.out.println(str2==str3);//true
System.out.println(str1==str3);//false
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
System.out.println(str2.equals(str3));//true
System.out.println(str1.equals(str4));//false
System.out.println(str4.equals(str1));//异常
}
}
输出结果:
1.str1==str2:指向不同内存堆地址,而“==”实际比较内容为地址,所以不相等,返回false;
2.str2==str3:str3为str2引用传递过去,引用同一对象,指向同一地址,所以相等,返回true;
3.str1==str3:指向不同内存堆地址,而“==”实际比较内容为地址,所以不相等,返回false;
4.equals比较的是内容,所以str1,str2,str3内容一致,返回true
注意:如果一个字符串值可能为null,那么在与其他字符串比较的过程中,切记把可能为null的字符串放在equals后面,而不是前面,如果放在前面会报上图中的空指针异常!
四、源码参考
1.String对equals的重写
2.String的构造方法