欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中如何判断对象中每一个字段都为空_重新认识Java的包装类

程序员文章站 2024-02-21 10:50:04
...

包装类

Java中每一种基本类型都会对应一个唯一的包装类,基本类型与其包装类都可以通过包装类中的静态或者成员方法进行转换。每种基本类型及其包装类的对应关系如下,值得注意的是,所有的包装类都是final修饰的,也就是它们都是无法被继承和重写的。

java中如何判断对象中每一个字段都为空_重新认识Java的包装类

包装类与基本类型的转换

从源代码的角度来看,基础类型和包装类型都可以通过赋值语法赋值给对立的变量类型,如下面的代码所示。

Integer a = 1;int a = new Integer(1);

这种语法是可以通过编译的。但是,Java作为一种强类型的语言,对象直接赋值给引用类型变量,而基础数据只能赋值给基本类型变量,这个是毫无异议的。那么基本类型和包装类型为什么可以直接相互赋值呢?这其实是Java中的一种“语法糖”。“语法糖”是指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会(来自百度百科)。换句话说,这其实是一种障眼法,那么实际上是怎么样的呢?下面是Integer a = 1;语句编译的字节码。

0: iconst_11: invokestatic #2 4: astore_1

首先,生成一个常量1,然后调用Integer.valueOf(int)方法返回Integer对象,最后将对象的地址(引用)赋值给变量a。Integer a = 1;其实相当于Integer a = Integer.valueOf(1);。

其他的包装类都是类似的,下表是所有包装类中的类型转换方法。

java中如何判断对象中每一个字段都为空_重新认识Java的包装类

“神奇”的包装类

如果不了解包装类中的一些机制,我们有时会碰到一些莫名其妙的问题,丈二和尚——摸不着头脑。

“莫名其妙”的NullPointException

在笔者开发经历中,碰到过不少因为请求参数或者接口定义字段设置为int(或者其他基本类型)而导致NullPointException。代码大致地运行步骤如下所示,当然不会跟这个完全一样。

Integer a = null;...int b = a; // 抛出NullPointException

上面的代码可以编译通过,但是会抛出空指针异常(NullPointException)。前面已经说过了,int b = a实际上是int b = a.intValue(),由于a的引用值为null,在空对象上调用方法就会抛出NullPointException。

两个包装类引用相等性

在Java中,“==”符号判断的内存地址所对应的值得相等性,具体来说,基本类型判断值是否相等,引用类型判断其指向的地址是否相等。看看下面的代码,两种类似的代码逻辑,但是得到截然不用的结果。

java中如何判断对象中每一个字段都为空_重新认识Java的包装类

这个必须从源代码中才能找到答案。Integer类中的valueOf()方法的源代码如下:

java中如何判断对象中每一个字段都为空_重新认识Java的包装类

由于1属于[-128, 127]集合范围内,所以valueOf()每次都会取出同一个Integer对象,故第一个“==”判断结果为true;而222不属于[-128, 127]集合范围内,所以valueOf()每次都会创建一个新的Integer对象,由于两个新创建的对象的地址不一样,故第一个“==”判断结果为false。

原文链接:https://blog.csdn.net/xialei199023/article/details/63251295