== 与equals

发布时间 2023-04-13 16:52:17作者: 人在代码在

在Java中,==操作符比较的是两个字符串对象的内存地址是否相同,而equals()方法比较的是两个字符串对象的值是否相等。通常情况下,如果两个字符串的内容相同,它们的内存地址也很有可能相同,此时==操作符和equals()方法都会返回true。

然而,在以下情况下,equals()方法可能返回true而==操作符返回false:

  1. 字符串常量池

字符串常量池是Java中缓存字符串的一个机制,使用字符串常量池可以避免重复创建相同的字符串对象,以节省内存空间。当使用双引号定义字符串时,如果字符串常量池中已经存在该字符串,那么Java会直接返回该字符串的引用。例如:

String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2); // 输出 true
System.out.println(str1.equals(str2)); // 输出 true

上述代码中,虽然str1和str2是两个不同的对象,但是它们在字符串常量池中的引用是相同的,因此==操作符返回true。

但是,如果使用new关键字创建字符串对象,Java会在堆内存中为这个字符串对象分配新的存储空间,而不会使用字符串常量池。例如:

String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // 输出 false
System.out.println(str1.equals(str2)); // 输出 true

上述代码中,因为str1和str2都是通过new关键字创建的新对象,它们在堆内存中的引用是不同的,因此==操作符返回false。