字符串比较==和equals

本文深入探讨了Java中字符串比较的细节,包括基本数据类型与引用类型的区别,使用==与equals()方法的场景及原因,以及字符串对象池的概念。通过具体代码示例,解释了如何避免空指针异常,为开发者提供了实用的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java中的数据类型分为字符型,数值型,布尔型和引用类型,其中字符型、数值型、布尔型统称为基本数据类型

1、观察基本数据类型的比较,利用“==”进行比较

public class MyInterface{
    public static void main(String[] args){
        int x = 23;
        int y = 23;
        System.out.println(x == y); //return value:true
    }
}

观察用 “==”进行String对象的比较

public class MyInterface{
    public static void main(String[] args){
        String str1 = "Hello";
        String str2 = new String("Hello");
        System.out.println(str1 == str2);

    }
}

上述代码返回值是false,这是为什么呢?

因为String是引用类型,直接使用“== “ 比较的是指向字符串的引用,即存储字符串的地址,在java中遇到new关键字就要开辟新空间,所以返回值为false

如果要比较字符串的内容就需要用String类的equals()方法进行比较如下述代码

public class MyInterface{
    public static void main(String[] args){
        String str1 = "Hello";
        String str2 = new String("Hello");
        System.out.println(str1.equals(str2)); //input:true
    }
}

2、再观察下面的代码

public class MyInterface{
    public static void main(String[] args){
        String str1 = "Hello";
        String str2 = "Hello";
        System.out.println(str1 == str2); //input:true
    }
}

上面的代码使用”==“比较时返回值却为 true,这就涉及到java中的对象池的概念。

对象池:JVM底层会自动维护一个字符串的对象池,如果现在采用直接赋值的形式进行String的对象实例化,该对象会自动保存在这个对象池中。如果下次继续使用直接赋值的模式声明String对象,此时对象池若有指定内容,则直接使用;如果没有,则开辟新的堆空间将其保存在对象池中供下次使用

上述代码中str2指向的字符串与第一次的字符串的内容相同,JVM没有新开辟空间,所以用 == 比较地址的时候,返回true

 

 

3、在用java判断用户输入的字符串是否与特定字符串相等,请看下面代码:

public class MyInterface{
    public static void main(String[] args){
        String str = null; //假设由用户输入

        //System.out.println(str.equals("hehe")); //运行时异常
        /**Exception in thread "main"           
           java.lang.NullPointerException
        at MyInterface.main(MyInterface.java:229)*/


        System.out.println("hehe".equals(str));  //返回false
    }
}

所以在比较字符串是否相等时,使用 :

String str  = " ";

"特定字符串".equals(str2);    //推荐使用该形式

str2.equals(特定字符串);        //有可能产生空指针异常

 

### Java 字符串 `equals` 方法与 `==` 运算符的区别 在 Java 中,字符串比较常见的数据类型之一,在实际开发中经常需要对其进行比较操作。以下是关于 `equals()` 方法 `==` 运算符的具体区别: #### 1. 基本概念 - **`==` 运算符**:它主要用于比较两个变量的值是否相等。对于基本数据类型(如 `int`, `char`),它是直接比较数值;而对于引用类型(如对象、数组、字符串),则是比较它们的内存地址是否相同 [^2]。 - **`equals()` 方法**:这是由 `Object` 类定义的一个方法,默认情况下也是用来比较对象的内存地址。然而,`String` 类重写了该方法,使其能够比较字符串的内容而不是内存地址 [^1]。 #### 2. 使用场景对比 - 当使用 `==` 对字符串进行比较时,如果两个字符串指向同一个对象或者通过编译期优化被分配到相同的常量池位置,则返回 `true`,否则即使内容一致也会返回 `false` [^3]。 - 而调用 `equals()` 方法则会逐字符地检查两个字符串的内容是否完全匹配,忽略其存储的位置差异 [^4]。 #### 示例代码说明 下面是一个简单的例子来展示两者的不同之处: ```java public class StringCompareExample { public static void main(String[] args) { String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); System.out.println(str1 == str2); // true,因为str1str2指向同一常量池中的实例 System.out.println(str1 == str3); // false,虽然内容一样但是str3创建了一个新的对象 System.out.println(str1.equals(str2)); // true,内容相同 System.out.println(str1.equals(str3)); // true,尽管不是同一个对象但内容相同 } } ``` #### 总结 因此,在日常编程实践中,应该根据具体需求选择合适的比较方式。如果是想确认两个字符串是否具有同样的内容,请始终使用 `equals()` 方法;而仅当你确实关心这两个变量是否确切表示同一个对象而非仅仅拥有相似的数据时才考虑采用 `==` 来做判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值