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

Java判断对象是否为空的方法:isEmpty,null,” “今天修改辞职同事遗留的代码才发现这个问题,不能用isEmpty来判断一个对象是否为null,之前没在意这个问题,在报了空指针之后才发现这个问题。查了一下关于判断为空的几个方法的区别,这里做一个简单的总结:null一个对象如果有可能是null的话,首先要做的就是判断是否为null:object==null,否则就有可能会出现空指针异常,这个通常是我们在进行数据库的查询操作时,查询结果首…

大家好,又见面了,我是你们的朋友全栈君。

今天修改辞职同事遗留的代码才发现这个问题,不能用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关键字开辟一个空间,内存在存储数据的时候都是通过地址来体现的,地址是一块连续的二进制,然后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是堆内存的特点,未初始化的数据是不能用的,但在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体:
在这里插入图片描述

下面看一个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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130763.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月13日 下午2:16
下一篇 2022年6月13日 下午2:16


相关推荐

  • 将cas-server-3.5.2 导入到myeclipse中

    将cas-server-3.5.2 导入到myeclipse中

    2021年8月31日
    65
  • 移动巡检系统_智能巡检app

    移动巡检系统_智能巡检app移动巡检系统我国的石油、燃气、自来水、电力的线路、管道和设备的巡检、陷巡视管理工作主要依靠巡检人员定期定时的人工巡检。传统的巡检工作主要采用手工纸记录的方式,不仅工作量巨大,效率低下,而且纸质的缺陷报

    2022年8月6日
    15
  • 揭秘vista引导机制

    揭秘vista引导机制揭秘vista引导机制   所谓的引导机制就是在操作系统内核运行前的一小段程序。其主要作用是初始化电脑硬件设备,建立内存空间的映射图。从而将系统的软件和硬件设备环境调配到一个适合的状态,以使电脑最终调用系统内核而准备好适合的环境。   那么vista的引导机制是否和以前的windows的版本不同呢?其实vista引导机制是一项全新的技术。以前寄予nt的windows系统采用“ntl

    2022年10月10日
    4
  • 【openbmc添加fru信息通过ipmitool命令读取】【后续】

    【openbmc添加fru信息通过ipmitool命令读取】【后续】openbmc 的 fru 配置文章目录一 service1 1 路径 1 2 文件内容 1 3of name to eeprom sh1 4 基于 service 的配置参数文件二 fru 数据模板 yaml 文件 2 1 路径 2 2 内容 2 3yaml 文件数据解析三 配置 3 1yaml 文件加载一 service 将 eeprom 数据读取到 bus 上的 service1 1 路径 xxx project meta phosphor recipes phosphor ipmi phosphor ipmi fru ob

    2025年11月4日
    9
  • 使用canvas实现擦玻璃效果

    体验效果:http://hovertree.com/texiao/html5/25/效果图:代码如下:关注微信公众号何问起,账号ihewenqi,或者微信扫描下面二维码关注。然后发送&quot

    2021年12月22日
    54
  • adb安装以及调试

    adb安装以及调试想必很多程序猿们都经历过一个头疼的事情是开发完一个项目之后,在你本机模拟是Ok的,但是到了正式环境上(机顶盒、手机等)却又bug百出,测试姐姐找的你头疼。那么我们就需要在自测的时候验证一下。废话不多说先来直接上正文:1.下载安装ADB下载安装非常快速简单,不到3MB。(需要下载的可以直接找我要)下载解压完之后不需要你去安装或者配置什么Path之类的东西,只需要记住你放在哪儿了就好。例如我放在了D盘,文件名叫ADB。2.是否正常运行输入:(1)win+R(2)进入cmd(3)D:(4)c

    2022年5月16日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号