java判断字符串String是否为空

2023-11-15

1、判空的四个方法

1、str == null;
//length就是取得字符串的长度
2、str.length == 0;
3"".equals(str);
//StringUtils.isEmpty判断某字符串是否为空,为空的标准是 str==null 或 str.length()==0
4、StringUtils.isEmpty(str);

//通过StringUtils判断是否为空(优先推荐使用org.apache.commons.lang包下的StringUtils来判断,原因是:用StringUtils可以避免空指针问题)

2、区别

==和equals

== 是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同
对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;

代码示例:

String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

equals() 是Object提供的一个方法.Object中equals()方法的默认实现就是返回两个对象==的比较结果.但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写.
equals 解读

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

class Cat {
    public Cat(String name) {
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

public boolean equals(Object obj) {
		return (this == obj);
}

原来 equals 本质上就是 ==。

那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 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;
}

原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
注意:== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

null和“”

1、null表示这个字符串不指向任何的东西,如果这时候你调用它的方法,那么就会出现空指针异常。
2、"“表示它指向一个长度为0的字符串,这时候调用它的方法是安全的。
3.、null不是对象,”“是对象,所以null没有分配空间,”"分配了空间,例如:

  String str1 = null; str引用为空
 String str2 = ""; str引用一个空串

即可知:对象用equals比较,null用双等号比较。
例子:判断字符串是否为空

正确的写法是 if(str1==null || str1.equals("")),

先判断是不是对象,如果是,再判断是不是空字符串
同理 判断一个字符串是否为空,首先就要确保他不是null,然后再判断他的长度。

    String str = xxx;
  if(str == null && str.length() == 0{ }

3、推荐使用

方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null || s.equals(""));

方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法: if(s == null || s.length() == 0);

方法三: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二. if(s == null || s.isEmpty());

方法四: 这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多: if (s == null || s == “”);

使用StringUtils进行判断

StringUtils.isBlank(null) = true

StringUtils.isBlank("") = true

StringUtils.isBlank(" ") = true

StringUtils.isBlank("sdf") = false

StringUtils.isBlank(" sdf ") = false

参考链接:

https://blog.csdn.net/weixin_41404773/article/details/79558355

如有侵权,请告知删除!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java判断字符串String是否为空 的相关文章

  • 使用缩略图器,我可以制作具有相同高度和宽度的缩略图,无论图像大小如何

    In 缩略图器 http code google com p thumbnailator 我正在制作缩略图 如果图像大小是 400 300 并且如果我执行以下操作 Thumbnails of new File original jpg si
  • 无法从 java 发送 48681 字节消息以保护 wcf 服务

    我必须使用相互身份验证从 java 调用安全的 WCF 服务 一切工作正常 除了我无法发送大小超过 48680 字节的消息 因此 48680 字节的消息已成功发送 但 48681 字节的消息未成功发送 并且 java 应用程序因读取超时异常
  • Emacs 打字骨架对插入也许

    在 Eclipse 中 编辑 Java 代码时 如果我输入一个左括号 我会得到一对括号 如果我然后 输入 第二个括号 它不会插入额外的括号 我如何在 emacs 中得到它 Eclipse 编辑器足够聪明 当我输入闭括号时 它知道我刚刚完成了
  • 如何正确地将MapStruct与Eclipse集成? (包括Lombok java代理)

    我愿意在一些官方项目中使用MapStruct 所以我决定先对其进行一些测试 我需要让它与 eclipse 集成工作 并遵循 MapStruct 网站上提供的所有说明 但是 到目前为止还没有运气 有人成功实现了这种整合吗 如果是的话我可以缺少
  • 如何实现 Eclipse 清理和构建(又名重建)?

    我删除了我的 binEclipse Indigo 中的文件夹 与 Helios 非常相似 现在我想知道如何重建我的 Java 项目 我只是找不到像 Netbeans 中那样的按钮 对于 Eclipse 您可以在下面找到重建选项项目 gt 清
  • Maven:无法在 OS X 上找到 java.lang 问题

    当我尝试时遇到以下问题mvn clean install显然它无法找到运行时 jar 但我需要做什么 错误日志 ERROR COMPILATION ERROR INFO ERROR Failure executing javac but c
  • java.io.IOException: EnsureRemaining: 仅剩余 0 个字节,尝试读取 1

    我在 giraph 中的自定义类方面遇到一些问题 我制作了 VertexInput 和 Output 格式 但总是收到以下错误 java io IOException ensureRemaining Only bytes remaining
  • JCombobox 字符串项(可见)和整数键(固有)

    我有一个数据库模式 它将作为 JTable 列显示在 JCombobox 中以选择名称 但我希望将 ID 字段插入 作为外键 到另一个表中 通常 在下拉列表中选择一个项目 将所选项目带到组合框的显示区域 我想要做的是 当选择组合框中的任何项
  • Java 增强型 For-Loop 比传统的更快?

    所以我的理解是 增强的 for 循环应该更慢 因为它们必须使用迭代器 但是我的代码提供了混合结果 是的 我知道循环逻辑占用了循环中花费的大部分时间 对于少量迭代 100 1000 增强的 for 循环在使用和不使用 JIT 的情况下似乎都要
  • 如何在我的 HttpClient 执行器中遵循单一职责原则?

    我在用RestTemplate http docs spring io spring docs current javadoc api org springframework web client RestTemplate html as
  • 堆内存与对象内存

    根据一篇关于Java内存和特性的论文 内存分数分为两种类型 堆内存 即应用程序在运行时消耗的内存 对象内存 即程序中使用的各种对象分配的内存 例如整数和字符串等 他们的意思是stack当他们说时的记忆object记忆 或者它们是什么意思 很
  • 在类路径中使用通配符调用 java 失败

    我当前目录中有一些 jar 它们都需要位于类路径中 因此我想对类路径使用通配符约定 命令行是 java exe classpath org python util jython args 但是我收到这个错误 Exception in thr
  • 获取 n 元组中的所有 1-k 元组

    当 n 5 且 k 3 时 以下循环将执行此操作 List
  • 使用 java 中的准备好的语句插入自定义 SQL 类型

    我有一些自定义类型 它们基本上都是枚举 以下是它们的外观示例 CREATE TYPE card suit AS ENUM spades clubs hearts diamonds 我在 Java 中有一些准备好的语句 看起来像这样 Setu
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 使用 JPA 存储库保留 Spring Batch ItemWriter 的问题

    我对春季批次有疑问ItemWriter它依赖于 JPA 存储库来更新数据 这里是 Component public class MessagesDigestMailerItemWriter implements ItemWriter
  • JList 类型不采用参数类型

    当我尝试编译一些代码时 我不断收到这些错误 CCC java 21 type javax swing JList does not take parameters JList
  • 正确的单元测试技术

    在使用 TDD 时 我发现自己需要测试一个包含查找值的常量 最终 哈希图 请查看更新中出现这种情况的原因 见下文 private static final Map
  • 如何在Java中添加两个“卡”的值?

    我正在开发一个项目来模拟二十一点游戏中的第一笔交易 到目前为止 程序创建了两张随机等级 ACE 到 KING 和随机花色的牌 我正在努力创建一个切换表或 if else 梯形图 将两张卡的附加值分配为可变分数 下面的代码从概念上代表了我想要
  • 只有创建视图层次结构的原始线程才能触摸其视图。在安卓上[重复]

    这个问题在这里已经有答案了 我只是一个初学者 所以请原谅我问一个可能愚蠢的问题 我不明白只有创建视图层次结构的原始线程才能触摸其视图的含义 请有人告诉我为什么会发生此错误以及如何解决此问题 ThankYou 这是我的班级 public cl

随机推荐

  • 数据结构之直接插入排序(算法思想,复杂度分析)以及冒泡排序和直接插入排序的比较

    一般来说 插入排序都采用in place在数组上实现 具体算法描述如下 从第一个元素开始 该元素可以认为已经被排序 取出下一个元素 在已经排序的元素序列中从后向前扫描 如果该元素 已排序 大于新元素 将该元素移到下一位置 重复步骤3 直到找
  • 【算法入门12】链表合并

    核心考点 链表合并 思维缜密程度 输入两个递增的链表 合并这两个链表并使新链表中的结点仍然是递增排序的 解析一 常规 合并两个链表最常规的做法就是 依次比较两个链表的第一个结点 取较小的结点 此处为递增排序 尾插到一个新链表后 直到其中一个
  • C语言 缓存区溢出 3221225725

    目录 问题描述 解决办法 问题描述 DEV C报错 Process exited after 4 03 seconds with return value 3221225725 原因 数组定义的容量太大 五十万起步的样子 而且每次循环都会再
  • Laravel定时任务的每秒执行

    我的个人博客 逐步前行STEP laravel中的任务调度可以不将每条命令都写入crontab 便于管理维护 而且可以基于laravel框架环境运行 而不需写独立的脚本执行 非常方便 但是最小的执行间隔也是一分钟 要想达到每秒执行的效果 就
  • 2018.7.18 something you want to replace

    Something I want to replace is iphone6 which looks like a small box When I come to university my parents brought me this
  • 【C++ Core Guidelines解析】C++学习之路的一盏明灯

    前言 C 语言的功能非常丰富 表达能力非常强 因为一种成功的通用编程语言拥有的功能必须比任何开发人员所需要的更多 任何一种有生命力且不断发展的语言都会不断积累用于表达程序员思想的替代用法 这会导致选择过载 那么 开发人员应该如何根据编程风格
  • 旧手机改服务器,并配合花生壳实现外网访问的方法

    旧手机改服务器 并配合花生壳实现外网访问的方法 前提准备 开始手机端操作 开始电脑端操作 至此所有操作结束 前提准备 1 手机必须root 2 busybox 3 linux deploy 4 花生壳安卓内网穿透版 下载时注意 有个管理版
  • 测试开发学习路线

    测试开发学习路线 HI 大家好 我是Lee 通过某些圈子了解大家对于测试开发这个岗位了解的很模糊 对于技术栈不知道应该学习什么 接下来就通过各方面来说一下测试开发具体是做什么以及需要掌握哪些技术 1 了解测试开发 什么是测试开发 大家应该都
  • 【学习笔记】mybatis-generator自动生成工具的使用教程 2021最新版

    一 什么是mybatis generator mybatis geneator是一款mybatis自动代码生成工具 可以通过配置 快速生成DAO POJO和xml等文件 二 如何在IDEA上使用mybatis generator 1 导入依
  • Redis Stream 数据结构实现原理真的很强

    1 是什么 Stream 是 Redis 5 0 版本专门为消息队列设计的数据类型 借鉴了 Kafka 的 Consume Group 设计思路 提供了消费组概念 同时提供了消息的持久化和主从复制机制 客户端可以访问任何时刻的数据 并且能记
  • dft转换与反转

    这次介绍下opencv中DFT的使用 对应的例程是 EXAMPLE dft 在图像处理领域 通过DFT可以将图像转换到频域 实现高通和低通滤波 还可以利用矩阵的卷积运算等同于其在频域的乘法运算从而优化算法降低运算量 即先将图像转换到频域 然
  • 容器化部署 Jib

    概念 Google Jib 容器化构建工具 Jib是google开源的Java容器化工具 可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库 以 Maven 和 Gradle 插件形式提供 通过 Jib Java 开发者可
  • 【省带宽、压成本专题】从产品架构来看,PCDN如何节流50%

    过去几年 我们一直在视频省流量方面潜心钻研 取得不俗的成果 本次 省带宽 压成本 系列一共会推出六篇文章 从技术迭代 硬件更新等角度出发 向大家介绍节省CDN流量 降低视频播放成本的方法 第一篇 从产品架构来看 PCDN如何节流50 目前国
  • 华为OD机试 - 欢乐的周末(Java)

    题目描述 小华和小为是很要好的朋友 他们约定周末一起吃饭 通过手机交流 他们在地图上选择了多个聚餐地点 由于自然地形等原因 部分聚餐地点不可达 求小华和小为都能到达的聚餐地点有多少个 输入描述 第一行输入m和n m代表地图的长度 n代表地图
  • 哈佛商学院私人笔记:如何一天拥有48小时?

    你的身边有没有这样一群人 永远精力充沛 永远有用不完的时间 工作 社交 生活 兴趣什么都不落下 谁都知道这得益于他们对时间的高效利用 但具体的妙招是什么呢 刚来到学校 哈佛 的时候我就被告知 你们的第一年是故意设计成很紧张的时间表 以锻炼你
  • C 标准库 - 《stdarg.h》

    原文链接 https www runoob com cprogramming c standard library stdarg h html 简介 stdarg h 头文件定义了一个变量类型 va list 和三个宏 这三个宏可用于在参数
  • STM32——DS18B20温度传感器

    一 DS18B20介绍 一 DS18B20技术性能特征 1 独特的单总线接口方式 DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯 大大提高了系统的抗干扰性 2 测温范围 55 C 125 C 3 支
  • 串口服务器485转以太网

    串口服务器485转以太网可以将485等串口设备连接到网络中 让这些设备采集的数据发往网络 建立串口和网络的透明传输通道 实现设备联网 用户可以使用组态软件或者自己编写网络通信程序和设备通信 上海卓岚串口服务器可支持虚拟串口协议 使得您也可以
  • [编程入门]自定义函数之字符串拷贝

    题目要求 有一字符串 包含n个字符 写一函数 将此字符串中从第m个字符开始的全部字符复制成为另一个字符串 include
  • java判断字符串String是否为空

    java判断字符串String是否为空 1 判空的四个方法 2 区别 和equals null和 3 推荐使用 1 判空的四个方法 1 str null length就是取得字符串的长度 2 str length 0 3 equals st