Java 中的 string.equals() 与 == 之间的比较

Rashmi Patidar 2021年10月2日
Java 中的 string.equals() 与 == 之间的比较

在 Java 中,有两种类型的对象比较。第一个是 == 运算符操作地址。它在内部比较对象的引用。另一方面,equals 方法比较实例的实际内容。

下面是演示运算符及其行为的代码块。

public class Main {
    public static void main(String[] args) {
        String str1 = "name";
        String str2 = "name";
        String str3 = new String("name");
        System.out.println(str1.equals(str2));
        System.out.println(str1 == str2);
        System.out.println(str1.equals(str3));
        System.out.println(str3 == str1);
    }
}

在上面的代码块中,定义了三个字符串实例。字符串类本质上是不可变的。不变性意味着创建的实例永远不会被覆盖。

此外,变量将内存保存在堆位置。因此,在生成字符串 name 时,它会保存在堆内存中。当另一个具有相同 name 值的新实例 str2 被初始化时,JVM 不会为其创建另一个新地址。相反,它将 str1 实例的引用分配给 str2 变量。

当我们尝试将 str1==str2 与两个字符串实例进行比较时,事实证明了这一点。由于两个引用都指向内存中的相同名称地址,因此语句的结果为 true。下图可以更好地理解所解释的事实。

字符串堆内存和常量池分配说明

类似地,当 equals 方法应用于两个实例时,它会产生布尔值 true 值。由于函数作用于内容比较,所以是相等的。

接下来,使用 new 关键字初始化另一个字符串 str3 变量。JVM 将在堆内存中为 name 地址内部创建一个新空间,而不是将实例分配给 str3 变量。因此,当进行内容比较时,它会在 equal 函数上返回 true。当使用 == 运算符比较地址时,它返回 false

这是上面代码块的输出。

true
true
true
false
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

相关文章 - Java String