Java 空和null的区别

 更新时间:2024年04月08日 15:59:32   作者:二哈喇子!  
本文主要介绍了Java 空和null的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言 StringUtils

提示:这里可以添加本文要记录的大概内容:

StringUtils 是 Apache Commons Lang 库中提供的一个工具类,专为处理 java.lang.String 类型的对象而设计。这个类提供了大量静态方法,用于执行各种常见的字符串操作,如检查空值、空白字符处理、比较、查找、截取、转换、拆分、拼接、填充、修剪等。StringUtils 类旨在作为 Java 标准库中 String 类方法的补充,提供更加便捷、高效且 null 安全的字符串处理功能。

以下几个方面概括了 StringUtils 的核心特点和用途:

  • Null-safe 字符串操作:
    StringUtils 方法通常会处理 null 值输入,避免直接调用 String 类方法时可能引发的 NullPointerException。例如,StringUtils.isEmpty(null) 会返回 true,而不是抛出异常。

  • 空值与空白字符检查:
    提供了一系列方法用于检查字符串是否为空、空字符串、仅包含空白字符或非空白字符:

    • isEmpty(String str): 检查字符串是否为 null 或长度为 0。
    • isNotEmpty(String str): 恰好与 isEmpty 相反,检查字符串是否非空(既不是 null 也不是长度为 0)。
    • isBlank(String str): 检查字符串是否为 null、长度为 0 或仅包含空白字符(如空格、制表符、换行符等)。
    • isNotBlank(String str): 恰好与 isBlank 相反,检查字符串是否非空且非空白。
  • 字符串修剪:
    提供了方法来去除字符串两端的空白字符:

    • trim(String str): 返回去除两端空白字符后的字符串副本。
    • trimToNull(String str): 去除两端空白字符,若结果为空字符串,则返回 null
    • trimToEmpty(String str): 去除两端空白字符,若输入为 null,则返回空字符串。
  • 字符串比较:
    提供了多种字符串比较方式,包括忽略大小写、忽略空白等:

    • equals(String str1, String str2): 安全地比较两个字符串是否相等。
    • equalsIgnoreCase(String str1, String str2): 同上,但忽略大小写。
    • compare(String str1, String str2): 比较两个字符串的字典顺序,返回整数结果。
  • 字符串拼接与拆分:
    提供了替代 String 类 concat 方法的拼接方法,以及基于特定分隔符的字符串拆分方法:

    • join(Object[] array, String separator): 将数组中的元素连接成一个字符串,用指定分隔符隔开。
    • split(String str, String separatorChars): 根据给定的分隔符将字符串分割成一个字符串数组。
  • 以及其他实用方法:
    包括但不限于查找子字符串、提取子字符串、重复字符串、检查字符串是否以特定字符开头/结尾、转换字符串为驼峰式/下划线式等。

使用 StringUtils 类的主要优点在于其简化了字符串处理逻辑,增强了代码可读性,同时提供了对 null 值的安全处理,有助于减少潜在的运行时错误。在Java开发中,尤其是在处理用户输入、数据清洗、配置解析、日志记录、数据序列化与反序列化等场景中,StringUtils 类方法常被广泛应用。要使用这些方法,需确保已将 org.apache.commons:commons-lang3 库添加到项目的依赖中。

提示:以下是本篇文章正文内容,下面案例可供参考

当然可以,接下来我将通过代码示例进一步详细阐述Java中"空"和"null"的区别:

1. 空(empty):

字符串:

String emptyString = "";
System.out.println(emptyString.length()); // 输出:0
System.out.println(emptyString.isEmpty()); // 输出:true

以上代码创建了一个空字符串"",其length()方法返回0,表示没有包含任何字符。同时,isEmpty()方法返回true,进一步验证这是一个空字符串。

集合:

List<String> emptyList = new ArrayList<>();
System.out.println(emptyList.size()); // 输出:0
System.out.println(emptyList.isEmpty()); // 输出:true

Set<String> emptySet = new HashSet<>();
System.out.println(emptySet.size()); // 输出:0
System.out.println(emptySet.isEmpty()); // 输出:true

这里创建了两个空集合:一个空的ArrayList和一个空的HashSet。它们的size()方法都返回0,表示没有包含任何元素。isEmpty()方法均返回true,确认它们是空集合。

2. null:

引用类型变量:

String nullString = null;
List<String> nullList = null;

try {
    System.out.println(nullString.length()); // 抛出 NullPointerException
    System.out.println(nullList.size()); // 抛出 NullPointerException
} catch (NullPointerException e) {
    System.out.println("Caught NullPointerException");
}

上述代码中,nullStringnullList分别被赋值为null。当试图调用它们的length()size()方法时,会抛出NullPointerException,因为它们并未指向任何实际对象。在实际编程中,需要通过条件判断或使用Objects.requireNonNull()等方法来避免此类异常。

基本类型变量:

int primitiveInt = 0;
Integer objectInt = null;

System.out.println(primitiveInt); // 输出:0
System.out.println(objectInt); // 输出:null

这里展示了基本类型变量(primitiveInt)与包装类型变量(objectInt)的区别。基本类型变量不能取null值,如primitiveInt被赋值为0,输出其值为0。而包装类型变量可以取null值,如objectInt被赋值为null,输出其值为null

3. isBlank

isBlank 包括了 empty 的检查范围,即 null 和空字符串

StringUtils.isBlank :是空字符串、只包含空白字符
!StringUtils.isBlank:非空字符串、不只包含空白字符

StringUtils.isBlank 是 Apache Commons Lang 库中提供的一个实用方法,用于判断给定的字符串是否为空白。这里的“空白”不仅包括空字符串(""),还包括只包含空白字符(如空格、制表符、换行符等)的字符串。具体来说,StringUtils.isBlank 方法的行为如下:

  • 空字符串 (""):如果输入的字符串长度为零(即没有任何字符),则认为是空白。

  • 只包含空白字符的字符串:如果输入的字符串中所有字符都是空白字符,如空格(' ', ASCII 32)、制表符(\t, ASCII 9)、换行符(\n, ASCII 10)、回车符(\r, ASCII 13)以及其他Unicode空白字符(如不间断空格、窄空格等),则认为是空白。

  • 非空白字符串:如果输入的字符串包含至少一个非空白字符,则认为不是空白。

简而言之,StringUtils.isBlank 方法旨在检测一个字符串是否既无实质内容又无意义,即要么完全没有字符,要么全部由空白字符组成。在编程实践中,此方法常用于数据验证、清理或格式化,帮助开发者快速判断一个字符串是否需要进一步处理或是否可以视为无效输入。

使用示例:

import org.apache.commons.lang3.StringUtils;

public class Example {
    public static void main(String[] args) {
        String emptyString = "";
        String whitespaceString = "     ";
        String nonEmptyString = "Hello, World!";

        System.out.println(StringUtils.isBlank(emptyString)); // 输出:true
        System.out.println(StringUtils.isBlank(whitespaceString)); // 输出:true
        System.out.println(StringUtils.isBlank(nonEmptyString)); // 输出:false
    }
}

在这个示例中,StringUtils.isBlank 分别判断了空字符串、只包含空白字符的字符串和非空白字符串,输出结果反映了它们是否被识别为空白。

总结:

通过上述代码示例,我们可以更直观地看到Java中"空"(empty)和"null"的区别:

  • “空”(empty)表示容器(如字符串、集合等)内没有内容,它们是实际存在的对象,可以进行各种对象操作(如计算长度、检查是否为空等),但通常不包含有意义的数据。
  • "null"表示引用没有指向任何对象,对null引用进行对象方法调用或属性访问会抛出NullPointerException。在使用引用类型变量时,需要特别注意处理可能的null值,以避免运行时异常。基本类型变量不能取null值。

 到此这篇关于Java 空和null是两回事的文章就介绍到这了,更多相关Java 空和null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springcloud Stream消息驱动工具使用介绍

    Springcloud Stream消息驱动工具使用介绍

    SpringCloud Stream由一个中间件中立的核组成,应用通过SpringCloud Stream插入的input(相当于消费者consumer,它是从队列中接收消息的)和output(相当于生产者producer,它是发送消息到队列中的)通道与外界交流
    2022-09-09
  • Spring 框架中的 Bean 作用域(Scope)使用详解

    Spring 框架中的 Bean 作用域(Scope)使用详解

    Spring框架中的Bean作用域(Scope)决定了在应用程序中创建和管理的Bean对象的生命周期和可见性。本文将详细介绍Spring框架中的Bean作用域的不同类型,包括Singleton、Prototype、Request、Session和Application,并解释它们的特点和适用场景。
    2023-09-09
  • 使用chatgpt实现微信聊天小程序的代码示例

    使用chatgpt实现微信聊天小程序的代码示例

    这篇文章主要介绍了使用chatgpt实现微信聊天小程序(秒回复),文中有详细的代码示例,对大家了解chatgpt聊天有一定的帮助,感兴趣的同学可以参考阅读
    2023-05-05
  • Java使用IO流实现音频的剪切和拼接

    Java使用IO流实现音频的剪切和拼接

    这篇文章主要为大家详细介绍了Java使用IO流实现音频的剪切和拼接,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java中实现Unicode编码解码的方法

    Java中实现Unicode编码解码的方法

    在Java编程中,Unicode编码解码是一项基本的操作,Unicode是一种用于表示文字字符的标准编码,它包含了世界上几乎所有的字符,包括各种语言的字母、符号和表情符号等,在Java中通过Unicode编码,我们可以将任意字符转换为字节流进行传输和存储
    2024-02-02
  • Java流处理stream使用详解

    Java流处理stream使用详解

    Java8的另一大亮点Stream,它与java.io包里的InputStream和OutputStream是完全不同的概念,下面这篇文章主要给大家介绍了关于Java8中Stream详细使用方法的相关资料,需要的朋友可以参考下
    2022-10-10
  • Springboot微服务分布式框架Rouyi Cloud权限认证(登录流程之token解析)

    Springboot微服务分布式框架Rouyi Cloud权限认证(登录流程之token解析)

    这篇文章主要介绍了Springboot微服务分布式框架Rouyi Cloud权限认证的相关知识,重点讲解下整个框架的入口,登录流程之token解析,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Springboot FeignClient调用Method has too many Body parameters解决

    Springboot FeignClient调用Method has too m

    本文主要介绍了Springboot FeignClient微服务间调用Method has too many Body parameters 解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java8函数式接口的基础学习教程

    Java8函数式接口的基础学习教程

    这篇文章主要给大家介绍了关于Java8函数式接口基础学习的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 深入同步访问共享的可变数据分析

    深入同步访问共享的可变数据分析

    本篇文章是对同步访问共享的可变数据进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论