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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CAN通信详解(全)

    本章我们将向大家介绍如何使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯,并将结果显示在TFTLCD模块上。本章分为如下几个部分:30.1CAN简介30.2硬件设计30.3软件设计30.4下载验证30.1CAN简介CAN是ControllerAreaNetwork的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全…

    2022年4月1日
    75
  • LINUX安全设置

    LINUX安全设置

    2021年8月31日
    57
  • git 清除用户名密码

    清空所有用户名和密码:gitconfig–system–unsetcredential.helper只用这一个命令就可以,如果不好使可以参照下面命令查看config配置:gitconfig–list查看git用户名:gitconfiguser.name清除缓存的用户名和密码:gitcredential-manageruninstall更改全局用户名:g…

    2022年4月8日
    450
  • RT-thread finsh移植到linux平台

    RT-thread finsh移植到linux平台目录FinSH介绍传统命令行模式C语言解释器模式FinSH移植移植要点效果验证代码下载参考在一次项目中,需要进行嵌入式操作系统选型,需求就是选择一款OS,既能满足当下项目的需要,又要考虑公司未来对物联网应用的扩展能力,对比了目前市面上流行的开源操作系统,诸如FreeRTOS,RTX,UCOS,RT-Thread,contiki等,最终确定了一款Io…

    2022年5月21日
    34
  • 求做3D游戏的一些想法,最好能用C++

    求做3D游戏的一些想法,最好能用C++本人第一次做3D游戏,可能做向CF这样的游戏个人有几个不明白的问题,希望能得到帮助:1 就是服务器判断阻挡点是怎么个思路?我自己还没一个想法,也可以和2D一样把经过的路线的点的多边形编号取出来再二分判断是不是有阻挡点,如果没有,那这条路是可用的,如果不可以,那说明是外挂!还有没有更好的方法!求大N2 还有3D游戏中要怎么表示多边形的点呢?(也就是用怎样的数据结构)我见recas

    2022年5月17日
    48
  • redis的分布式解决方式–codis

    redis的分布式解决方式–codis

    2022年1月27日
    41

发表回复

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

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