网站首页 > 技术文章 正文
java 开发中我们经常会用到的数据判空、数据比较和不同数据之间的类型转换,尤其数据判空可以让我们避免经常会出现的 NullPointerException 空指针异常报错。
一、数据判空
开发中判空时推荐使用工具库:StringUtils、CollectionUtils、ArrayUtils、Objects、NumberUtils
1、字符串判空
// 方式1:判断是否为 null 或空字符串
if (str == null || str.isEmpty()) {}
// 方式2:判断是否为 null 或空字符串
if (str == null || str.length() == 0) {}
// 方式3:判断是否为 null 或空字符串
if (str == null || str.equals("")) {}
// 方式3:判断是否为 null 或空字符串或空格或空白符
if (str == null || str.trim().length() == 0) {}
推荐使用:
// 方式1:判断是否为 null 或空字符串
if (StringUtils.isEmpty(str)) {}
// 方式2:判断是否不为 null 或空字符串
if (StringUtils.isNotEmpty(str)) {}
// 方式3:判断是否有任意一个为 null 或空字符串
if (StringUtils.isAnyEmpty(str, str2, str3)) {}
// 方式4:判断是否全部都不为 null 或空字符串,跟 isAnyEmpty 相反,可以用来做表单必填参数校验
if (StringUtils.isNoneEmpty(str, str2, str3)) {}
// 方式5:判断是否为 null 或空字符串或空格或空白符
if (StringUtils.isBlank(str)) {}
// 方式6:判断是否不为 null 或空字符串或空格或空白符
if (StringUtils.isNotBlank(str)) {}
// 方式7:判断是否有任意一个为 null 或空字符串或空格或空白符
if (StringUtils.isAnyBlank(str, str2, str3)) {}
// 方式8:判断是否全部都不为 null 或空字符串或空格或空白符,跟 isAnyBlank 相反,可以用来做表单必填参数校验
if (StringUtils.isNoneBlank(str, str2, str3)) {}
2、Integer 判空
基本数据类型 int 是不能为 null 的,只有包装类型 Integer 才能赋值为 null
if (integer == null || integer.equals(0)) {}
if (integer == null || integer.intValue() == 0) {}
推荐使用:
if (NumberUtils.isNullorZero(number)) {}
3、对象判空
if (obj == null) {}
if (obj != null) {}
推荐使用:
if (Objects.isNull(obj)) {}
if (Objects.nonNull(obj)) {}
4、List判空
// 方式一
if (list == null || list.size() == 0) {}
// 方式二
if (list == null || list.isEmpty) {}
推荐使用:
if (CollectionUtils.isEmpty(list)) {}
5、Map判空
// 方式一
if (map == null || map.size() == 0) {}
// 方式二
if (map == null || map.isEmpty) {}
推荐使用:
if (CollectionUtils.isEmpty(map)) {}
6、Set判空
// 方式一
if (set == null || set.size() == 0) {}
// 方式二
if (set == null || set.isEmpty) {}
推荐使用:
if (CollectionUtils.isEmpty(set)) {}
7、数组判空
注意 java 中数组长度是不可变的,而且只能储存同一种类型的数据,length 是数组的一个长度属性并不是方法,表示当前数组可以储存多少个长度的数据。字符串 String 的 length() 是一个方法,返回的是字符串的长度。集合类型的长度是要用 size 方法去获取,集合没有 length 属性。
if (array == null || array.length == 0) {}
推荐使用:
if (ArrayUtils.isEmpty(array)) {}
常见疑问: - CollectionUtils.isEmpty 和 Objects.isNull 的区别 前者判断集合是否为 null 或空集合,后者仅判断是否为 null - CollectionUtils.isEmpty 和 == null 的区别 前者判断集合是否为 null 或空集合,后者仅判断是否为 null - Objects.isNull 和 == null 的区别 两者是等价的,可以看 Objects.isNull 的源码
public static boolean isNull(Object obj) {
return obj == null;
}
二、数据比较
基本数据类型比较
double、float、long、int、short、byte、char、boolean 这8种基本数据类型比较,可以直接用 == 进行比较
int age = 10;
double myAge = 18.5;
if (myAge > age) {} // true
引用数据类型比较
引用数据类型直接用 == 或用 equals 方法比较的都是引用地址是否相等,不过注意字符串 String 因为重写了 equals 方法是个例外。
字符串比较
java 中字符串是引用数据类型,并不能直接像 javascript 中那样直接用 == 判断是否相等,而是需要使用 equals 方法去判断是否相等:
String xiaoMing = "xiaoming";
String xiaoHong = "xiaoming";
if (xiaoMing == xiaoHong) {} // true
if (xiaoMing.equals(xiaoHong)) {} // true
上面的比较很多人会纳闷为什么用 == 直接比较两个字符串也是 true,那是不是说字符串我们也是可以直接用 == 去比较的,这个就涉及字符串常量池了,实际我们换一种赋值方式你就能发现又不等了:
String xiaoMing = "xiaoming";
String xiaoHong = new String("xiaoming");
if (xiaoMing == xiaoHong) {} // false
if (xiaoMing.equals(xiaoHong)) {} // true
只用记住字符串你就用 equals 去比较值是否相等就行了。
三、类型转换
自动类型转换(显示转换)
范围小的转成大的,不会有任何问题,java 会自动为我们进行转换:double -> float -> long -> int -> short -> byte,注意byte、short和char不能相互转换
int age = 18;
double money = age;
强制类型转换(隐式转换)
范围大的转成小的,直接赋值是会报错的,但是我们可以用小括号语法强制类型转换,但是这可能会导致数据精度损失或溢出:
double pi = 3.1415926;
int num = (int) pi; // 3,小数部分会丢失
数值类型转字符串
一般用于给前端返回的数据时常用到,可以用 String.valueOf 方法,或者直接用 + 加上空字符串:
int age = 18;
String userAge = String.valueOf(age);
String userAge2 = age + "";
字符串转数值
一般需要用于数学运算时,比如我们从其他地方获取到的数据是数字字符串,我们需要对起进行加减乘除必须要先转成数值类型,这时可以利用数值类型提供的方法来进行转换 Double.parseDouble、Float.parseFloat、Long.parseLong、Integer.parseInt()、Short.parseShort、Byte.parseByte,不过实际开发中要注意自己判空和捕获转换异常,推荐使用第三方库来转换:
String userAge = "18";
int age = Integer.parseInteger(age) * 3;
猜你喜欢
- 2024-10-08 集合框架-ArrayList源码分析(java集合框架源码解析)
- 2024-10-08 大数据编程入门:Java ArrayList(java大数据视频教程)
- 2024-10-08 Python开发入门之列表-List(python列表的基本操作编程)
- 2024-10-08 如何在python各种列表中求最值?(如何在python各种列表中求最值的方法)
- 2024-10-08 List接口常用方法(list接口的常用方法)
- 2024-10-08 Python语法基础(6)集合(python中的集合)
- 2024-10-08 Java初学者学习任务总结「15」(java学习知识点路线)
- 2024-10-08 Sonar代码规范分析(sonar代码扫描规则及解决方案)
- 2024-10-08 最详细集合源码解析之ArrayList集合源码解析
- 2024-10-08 代码优雅之道——c#如何判空(c#判断输入是否为空)
- 10-02基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- 10-02Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- 10-02AWD-LSTM语言模型是如何实现的_lstm语言模型
- 10-02NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 10-02使用ONNX和Torchscript加快推理速度的测试
- 10-02tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- 10-02Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- 10-02Gateway_gateways
- 最近发表
-
- 基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- AWD-LSTM语言模型是如何实现的_lstm语言模型
- NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 使用ONNX和Torchscript加快推理速度的测试
- tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- Gateway_gateways
- Coze开源本地部署教程_开源canopen
- 扣子开源本地部署教程 丨Coze智能体小白喂饭级指南
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)