【Java】对“==”与equals方法判断字符串是否相等的详细解析(两者区别)

一、代码及结果展示

String str1 = "abcdefg";
String str2 = str1;

System.out.println(str1.equals(str2));

// 输出结果:
true
String str1 = "abcdefg";
String str2 = new String("abcdefg");

System.out.println(str1.equals(str2));

// 输出结果
true
String str1 = "abcdefg";
String str2 = str1;

System.out.println(str1 == str2);

// 输出结果:
true
String str1 = "abcdefg";
String str2 = new String("abcdefg");

System.out.println(str1 == str2);

// 输出结果:
false

二、对计算机底层内存的理解

1、内存主要分为堆和栈两大部分。栈的特点是“FILO”,即先进后出,所以栈的访问速度更快。

2、当使用String str时,实质上是在栈中创建了一个变量str。

3、当对String进行赋值时,系统会先在堆内存中的常量池中查找该值是否存在,若存在则将该值的地址传给变量str,否则在堆内存中申请一块空间并存入值,再将该值的地址传给变量str。

4、new关键字是直接在堆内存中申请一块新的空间并存入值。所以图二中str1与str2的值是相同的,但其分别指向不同的地址。

三、“==”与equals方法判断字符串是否相等的区别(重点)

1、“==”:

        当使用str1 == str2来判断字符串是否相等时,系统实际是通过判断两端的变量的地址是否相同来判断两个字符串是否相等的。

2、equals方法:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

        通过查看equals方法的源代码可以发现,该方法使用的是将字符串转为字符数组,再对字符数组的每一个位置的字符进行依次比较,从而判断字符串的值本身是否相等,而不是根据地址判断。

四、两种判断是否相等的方法及输出详细解析

// 在栈中创建了一个变量str1
// 将值"abcdefg"赋值给str1,系统先在常量池中查看是否存在该值
// 显然此时常量池中不含有该值,所以申请一块空间存入该值,并将值的地址传给变量str1
String str1 = "abcdefg";

// 在栈中创建了一个变量str1
// 将str1的值赋值给str2
// 先在常量池中查看值"abcdefg"是否存在,因为上面已经创建了,所以直接将上面值的地址也传给str2
String str2 = str1;

// 此时两个变量的地址是相同的,所以两个字符串也是相同的,所以结果为true

System.out.println(str1.equals(str2));

// 输出结果:
true
// 在栈中创建了一个变量str1
// 将值"abcdefg"赋值给str1,系统先在常量池中查看是否存在该值
// 显然此时常量池中不含有该值,所以申请一块空间存入该值,并将值的地址传给变量str1
String str1 = "abcdefg";

// 在栈中创建了一个变量str1
// 将str1的值赋值给str2
// 先在常量池中查看值"abcdefg"是否存在,因为上面已经创建了,所以直接将上面值的地址也传给str2
String str2 = str1;

// 此时两个变量的地址是相同的,所以结果为true

System.out.println(str1 == str2);

// 输出结果:
true
// 这一句与上面相同,所以不再赘述
String str1 = "abcdef";

// 这一句使用了new关键字,所以传给str2的地址是一个新的地址,与str1的地址不同
String str2 = new String("abcdefg");

// 此时虽然两个字符串的地址不相同,但是其本身的值是相同的,所以结果为true
System.out.println(str1.equals(str2));

// 输出结果
true
// 这一句与上面相同,所以不再赘述
String str1 = "abcdef";

// 这一句使用了new关键字,所以传给str2的地址是一个新的地址,与str1的地址不同
String str2 = new String("abcdefg");

// 此时两个字符串的地址不相同,虽然值是相同的,但==只判断地址,所以结果为false
System.out.println(str1 == str2);

// 输出结果
false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java中,可以使用String类来创建字符串。在判断两个字符串是否相等时,可以使用equals方法和==运算符。 equals方法是用来比较两个字符串的内容是否相等的,它会比较两个字符串的每个字符是否相等,如果相等则返回true,否则返回false。 而==运算符是用来比较两个字符串对象的引用是否相等的,如果两个字符串对象的引用指向同一个对象,则返回true,否则返回false。 因此,在判断两个字符串是否相等时,应该使用equals方法,而不是==运算符。 ### 回答2: Java语言字符串的处理,是非常重要的一部分内容。String类是Java中的字符串类,它提供了一些比较常用的方法,其中包括equals和==。关于这两种方法判断字符串是否相等,以下内容做一些介绍和解析。 首先,需要了解的是:Java字符串是不可变的,也就是说一旦定义了一个字符串,它的值就不能被修改,如果要对它进行修改,则需要新创建一个字符串。这种特性,也是这两种字符串相等判断方法的一个原因。 当使用equals方法时,它会比较两个字符串的内容是否相同。例如: ``` String str1 = "hello"; String str2 = "hello"; boolean result = str1.equals(str2); //true ``` 可以看出,这里的result变量的值为true,这是因为这两个变量的值相等。那么,如果现在str2不是使用直接赋值的方式,而是使用new关键字创建,则两者是否相等呢?代码如下: ``` String str1 = "hello"; String str2 = new String("hello"); boolean result = str1.equals(str2); //true ``` 同样可以看到,这两个变量的值也是相等的,也就是equals方法返回的值是true。 接下来,再看一下使用==判断字符串相等方法。当使用==时,它会比较两个变量的值是否相等,也就是判断两个变量是否指向同一个对象。例如: ``` String str1 = "hello"; String str2 = "hello"; boolean result = (str1 == str2); //true ``` 此时,变量result的值是true,因为这两个变量指向的是同一个对象。但是,如果现在str2变量不再是使用直接赋值的方式,而是使用new关键字创建,如下: ``` String str1 = "hello"; String str2 = new String("hello"); boolean result = (str1 == str2); //false ``` 可以看到,此时result的值为false,因为这两个变量指向的是两个不同的对象。 总结一下,使用equals方法可以判断两个字符串的内容是否相同,即使这两个字符串是通过不同的方式创建的;使用==方法判断两个变量指向的是否是同一个对象。因此,在使用字符串时,要根据实际情况选择适当的方法判断字符串是否相等。 ### 回答3: Java中的字符串是不可变的对象,每次对其进行操作都会创建一个新的字符串对象。因此,在比较字符串是否相等时,我们需要使用equals方法,而不是==操作符。 String类提供了equals方法来比较两个字符串对象的内容是否相等。这个方法比较的是字符串的内容,即两个字符串所包含的字符序列是否完全一样。例如, String str1 = "Hello"; String str2 = "world"; boolean result = str1.equals(str2); System.out.println(result); // false 在上面的代码中,str1和str2的内容不一样,因此result的值为false。 相反,==操作符比较的是两个对象的地址是否一样,即它们是否引用同一个对象。例如, String str1 = "Hello"; String str2 = "Hello"; boolean result = str1 == str2; System.out.println(result); // true 在上面的代码中,str1和str2都是"Hello",它们引用的是同一个字符串对象,因此result的值为true。 但需要注意的是,当我们使用new运算符创建字符串对象时,==操作符将无法判断两个字符串对象的内容是否相等。例如, String str1 = new String("Hello"); String str2 = new String("Hello"); boolean result = str1 == str2; System.out.println(result); // false 在上面的代码中,str1和str2都是新创建的字符串对象,它们引用的地址不同,因此result的值为false,而不是我们想要的true。因此在判断两个字符串对象是否相等时,我们应该使用equals方法,而不是==操作符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值