首页 > 编程语言 >Java字符串比较 == 和 equals方法的区别

Java字符串比较 == 和 equals方法的区别

时间:2023-07-08 16:01:37浏览次数:32  
标签:Java String str2 str1 equals println 字符串 null


今天在排除一个bug的时候出现了一个很低级但是也很容易被忽视的错误,在此写了一个小例子做记录。

首先我先说一下错误的场景,我读取了一段json数据,并使用JSONObject的实例对象的getString方法去拿到了一个value数据,由于我忽视了getString方法的返回值是一个String对象,所以我在后面的处理使用了双等号去判断这个值 是否 等于 "" 或者 null ,所以这就出现了逻辑问题,导致程序出错。

举个例子,假如这个json串是这个样子的:

{
  "str1" : null,
  "str2" : ""
}

两个value分别是空字符串和null,当我使用getString方法去获取值的时候,实际上拿到的是两个被转为String对象示例的值,也就是:

String str1 = new String("");

String str2 = new String("null");

str1 == ""
所以当我使用 == 去判断 "" 和 一个 String空串对象是否相等的时候,那一定会返回false,因为双等号判断的是两个变量的地址是否相同,很显然,"" 位于字符串常量池,而str1是String对象的示例,位于堆空间,二者的地址一定是不同的。

如果想要比较,应该用这个方法equals( )。

"".equals(str1)	// 最好把变量放在equals里面,防止空指针异常。
// 该语句会返回true,因为比较的是字符串的内容是否一样,而且"" 其实首先会转为String对象再去和equals里面的参数进行比较,所以结果肯定是true。

null不会被转为null字符串对象,也即不会变成 "null" 。

test.json

{
  "str1" : null,
  "str2" : ""
}

例子

        String jsonFilePath = "D:\\school\\technology_novelty_search_data_analysis_system\\tech\\src\\main\\java\\com\\ruoyi\\test\\qcc\\test.json";
        try {
            // 读取 JSON 文件内容
            String jsonString = new String(Files.readAllBytes(Paths.get(jsonFilePath)));
            // 解析 JSON
            JSONObject jsonObject = JSON.parseObject(jsonString);
            // 获取某个值
            String str1 = jsonObject.getString("str1");
            // 其实 str2 和 str3 是一样的类型 都是String空串对象
            String str2 = jsonObject.getString("str2");
            String str3 = new String("");

            // null 不会被转为 null 字符串对象
            System.out.println("str1: " + str1);
            System.out.println(str1 == null);   // true
            System.out.println("null".equals(str1));   // false

            System.out.println("str2: " + str2);
            System.out.println("str3: " + str3);
            System.out.println(str3 == ""); // false
            System.out.println("".equals(str2));    // true
            System.out.println("".equals(str3));    // true
        } catch (IOException e) {
            e.printStackTrace();
        }

image-20230708154408621

标签:Java,String,str2,str1,equals,println,字符串,null
From: https://www.cnblogs.com/rainbow-1/p/17537357.html

相关文章

  • java Swing和AWT是什么关系?
    1)AWT是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。2)AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。参考:https://www.cnblogs.com/RUI2022/p/16975881.html参考2:https://www.cnblogs.com/2008nmj/p/16257373.html(ge......
  • 解决MySQL存储较长的字符串的具体操作步骤
    MySQL存储较长的字符串在数据库中,我们经常需要存储各种类型的数据。有时,我们需要存储较长的字符串,如文章内容或者文本文件。MySQL是一个流行的关系型数据库管理系统,它提供了多种方式来存储较长的字符串数据。本文将介绍在MySQL中存储较长的字符串的几种常用方法,并提供相应的代码示......
  • 如何实现MySQL 字符串转换成数组的具体操作步骤
    MySQL字符串转换成数组在MySQL中,我们经常需要对字符串进行处理和转换。有时候,我们需要将一个字符串拆分成多个部分,然后进行进一步的处理。这时,将字符串转换成数组是一种常见的操作。方法一:使用SUBSTRING_INDEX函数MySQL提供了SUBSTRING_INDEX函数,可以用于将一个字符串按照指定......
  • 如何实现Java转账借口的具体操作步骤
    Java转账接口实现指南引言作为一名经验丰富的开发者,我将向你介绍如何实现Java转账接口。在本文中,我将为你展示整个流程,并提供逐步指导,帮助你理解每一步需要做什么。让我们开始吧!流程概述下表展示了实现Java转账接口的步骤:步骤描述1创建一个Java类2添加转账方法......
  • 如何实现Java中使用注解校验参数的具体操作步骤
    Java中使用注解校验参数简介在Java开发中,我们经常需要对方法的参数进行校验,以确保传入的参数符合我们的要求。而注解是一种常用的方式来实现参数校验。本文将介绍如何在Java中使用注解来校验参数,并给出一些示例代码帮助理解。整体流程下面是使用注解校验参数的整体流程,我们将通......
  • Java中如何将int型转换成float型 这个问题怎么解决?
    Java中如何将int型转换成float型在Java中,将int型转换成float型可以通过类型转换来实现。这在处理数字计算或者进行数据类型转换时非常常见。下面我们来解决一个实际问题,示范如何将int型转换成float型。实际问题假设我们要编写一个Java程序来计算一个人的BMI(BodyMassIndex)指数......
  • 解决Java中的byte数组不够补空格的具体操作步骤
    Java中的byte数组不够补空格在Java编程中,我们经常需要处理二进制数据,其中byte数组是一种常见的数据类型。然而,在某些情况下,我们可能需要将byte数组的长度扩展到指定的长度,不足的部分用空格进行补齐。本文将介绍在Java中如何实现byte数组的补齐操作,并提供相关代码示例。为什么需要......
  • 解决Java中变量+字符的具体操作步骤
    Java中变量+字符实现方法详解引言在Java中,我们可以将变量与字符结合使用,以实现一些特定的功能。本文将详细介绍如何在Java中实现变量与字符的操作,并提供相应的示例代码。流程为了更好地理解如何实现变量与字符的操作,我们可以将整个过程分解为以下几个步骤:步骤描述1......
  • 如何实现Java中@Table和@TableName注解的区别的具体操作步骤
    Java中@Table和@TableName注解的区别1.流程为了更好地理解和使用Java中的@Table和@TableName注解,我们可以按照以下步骤进行操作:步骤描述1.导入相关依赖2.创建数据库表3.创建实体类4.使用@Table注解5.使用@TableName注解6.测试运行2.操作步......
  • Java怎么给下拉框赋值 这个问题怎么解决?
    项目方案:基于Java的下拉框赋值方案1.项目背景和需求分析在开发基于Java的应用程序时,我们经常需要使用下拉框(ComboBox)来展示选项列表,并将选中的值保存到后台。本项目方案旨在提供一种简单而有效的方法来给下拉框赋值,并且能够动态更新选项列表。2.项目目标和功能实现下拉框数......