当前位置:首页 > Java技术 > Java判断对象是否为空的方法:isEmpty,null," "

Java判断对象是否为空的方法:isEmpty,null," "

2022年09月16日 21:43:55Java技术4

今天修改辞职同事遗留的代码才发现这个问题,不能用isEmpty来判断一个对象是否为null,之前没在意这个问题,在报了空指针之后才发现这个问题。

查了一下关于判断为空的几个方法的区别,这里做一个简单的总结:

  1. null

一个对象如果有可能是null的话,首先要做的就是判断是否为null:object == null,否则就有可能会出现空指针异常,这个通常是我们在进行数据库的查询操作时,查询结果首先用object != null,进行非空判断,然后再进行其他的业务逻辑,这样可以避免出现空指针异常。

  1. isEmpty() 此方法可以使用于字符串,数组,集合都可以用。

首先看一下源码:

    public boolean isEmpty() {
     
        return value.length == 0;
    }

这里是一个对象的长度,使用这个方法,首先要排除对象不为null,否则当对象为null时,调用isEmpty方法就会报空指针了。

要想返回true,也就是一个对象的长度为0,也就是说首先这个对象肯定不为null了,内容为空时,才能返回true。

这里我想到了之前看过视频里面说到的栈和堆的问题,当创建一个新的对象时,栈里面有一个对象,堆里面有一个对象,栈里的对象指向堆里面的对象。对象包含引用对象和实际对象,也就是栈和值的关系,比如String a = new String();,这句代码就在堆内存中产生了一个String对象"",和栈内存中一个引用对象a,也就是a指向了一个为空的字符串。当没有再次给引用对象a进行赋值时,操作a也即是操作这个空字符串。

栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

堆内存:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

下面我们通过一个图例详细讲一下堆和栈:

比如主函数里的语句 int [] arr=new int [3];在内存中是怎么被定义的:

主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,但是右边不是一个具体值,是一个实体。实体创建在堆里,在堆里首先通过new关键字开辟一个空间,内存在存储数据的时候都是通过地址来体现的,地址是一块连续的二进制,然后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是堆内存的特点,未初始化的数据是不能用的,但在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体:
Java判断对象是否为空的方法:isEmpty,null," " _ JavaClub全栈架构师技术笔记

下面看一个demo:

	public static void main(String[] args) {
     
		String a = new String();
		String b = "";
		String c = null;
		if (a.isEmpty()) {
     
			System.out.println("String a is empty");
		}
		if (b.isEmpty()) {
     
			System.out.println("String b is empty");
		}
		if (c == null) {
     
			System.out.println("String c = null");
		}
		if (null == a) {
     
			// 编译器直接就提示了Dead code,a指向了一个新对象,肯定不是null了
			System.out.println("String a =null");
		}
		if (a == "") {
     
			System.out.println("a = ''");
		}
		if (a.equals("")) {
     
			//由于a是字符串,字符串的比较需要用equals,不能直接用 ==
			System.out.println("a = ''");
		}
		/*if (c.isEmpty()) {
			// 这里会报空指针,即null不能使用此方法
			System.out.println("c == null   and   c.isEmpty");
		}*/
		
		List<String> list = new ArrayList<>();
		//list.add("");
		if (list.isEmpty()) {
     
			System.out.println("list is empty");
		}
		System.out.println(list.size());
	}
/*Output:
String a is empty
String b is empty
String c = null
equals:a = ''
list is empty
0
*/

参考文章:
堆和栈的概念和区别 : https://blog.csdn.net/pt666/article/details/70876410/
JAVA中isEmpty和null以及""的区别 : https://blog.csdn.net/lhflower123/article/details/8223607

作者:linmengmeng_1314
来源链接:https://blog.csdn.net/linmengmeng_1314/article/details/86085314

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42283.html

分享给朋友:

“Java判断对象是否为空的方法:isEmpty,null," "” 的相关文章

Java中四种访问修饰符的区别

在java中共有4种访问级别,按访问权限由高到低为:public(公有的)、protected(受保护的)、友好的(没有任何访问权限关键字修饰)和private(私有的)。 类型 类内部 同一个包其...

深入理解 Java 并发锁

深入理解 Java 并发锁

📦 本文以及示例源码已归档在 javacore 一、并发锁简介 确保线程安全最常见的做法是利用锁机制(Lock、sychronized)来对共享数据做互斥同步,这样在同一个时刻,只有一个线程可以执行某个方法或者某个代码块,那么操作必然是原子性的,线程安全的...

Java日志框架那些事儿

Java日志框架那些事儿

在项目开发过程中,我们可以通过 debug 查找问题。而在线上环境我们查找问题只能通过打印日志的方式查找问题。因此对于一个项目而言,日志记录是一个非常重要的问题。因此,如何选择一个合适的日志记录框架也非常重要。在Java开发中,常用的日志记录框架有JDKLog、Log4J、LogBack、SLF4J...

Java实现阶乘运算

n!=123*…n 学习编程就是要了解从问题到程序是如何实现的 Scanner in=new Scanner(System.in); int n ; n=in.nextInt(); // int i=1; int factor=1;...

java数数字及while和do while 的使用,以及程序的调试与验证

while的条件是在进入循环体之前判断的,执行完一轮循环之后,会再回到循环开始的地方再次判断条件,而不会在循环体中随时判断条件 1.while语句是当条件满足时不断的执行循环体内语句。 2.会提前判断是否满足条件,所以有可能一次也没有执行。 3.条件成立...

java中将英尺换算为身高

java中将英尺换算为身高

直接上代码 如图所示便是身高的换算,你学到了吗?、 int foot; double inch; Scanner in=new Scanner(System.in); foot=in.nextInt(); inch=in.nextDouble...

在JAVA 中将堆与栈分开的原因

栈是运行时的单位,而堆是存储的单位。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么 放、放在哪儿。 注意:在Java中一个线程就会相应有一个线程栈与之对应 栈因为是运行单位,因此里面存储的信息都是跟...

Java获取明天的时间(当前时间加一天)

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar;     public class&nbs...

动车上的书摘-java对象流与序列化

动车上的书摘-java对象流与序列化

动车上的书摘-java对象流与序列化摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢!钢笔不限贵便宜,书法是来自心对手的交流。-泥沙砖瓦浆木匠 一.对象序列化当需要存储相同类型的数据,选...

全网最细笔记java与kotlin的一些异同

本文主要介绍java与kotlin的一些异同 后面可能还会继续比较kotlin和dart 期待吗? 打印日志 Java System.out.print("Amit Shekhar"); S...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。