Java中Boolean和boolean的区别详析

 更新时间:2022年07月12日 16:01:47   作者:mkii_hong  
boolean是基本数据类型Boolean是它的封装类,和其他类一样,有属性有方法,可以new,下面这篇文章主要给大家介绍了关于Java中Boolean和boolean区别的相关资料,需要的朋友可以参考下

前言

​上次一个同学问,Boolean 类型的值不是只有 true 和 false 两种吗?为什么他定义的属性出现了 null 值?

我们应该先明确一点,boolean 是 Java 的基本数据类型,Boolean 是 Java 的一个类。boolean 类型会在“赋零值”阶段给属性赋 false。而 Boolean 是一个类,会在“赋零值”阶段给对象赋 null。

如果是静态属性,会在类加载时被赋值。如果是普通类属性,会在实例化对象时赋值。这两点可以了解一下“类加载机制”和“对象创建过程”。

类加载机制:

  • 加载:根据类的全名获取类的二进制字节流,将类加载进内存并在堆中生成一个代表这个类的 Class 对象,作为方法区数据的访问入口
  • 验证:验证 class 文件中的字节流是否符合 JVM 规范
  • 准备:在方法区中为类的静态属性分配内存,并初始化默认值(boolean 的默认值是 false,Boolean 的默认值是 null)
  • 解析:将常量池中的符号引用转化为直接引用,可以理解为对象引用转成指针
  • 初始化:真正开始执行类中的代码,静态属性赋值和静态块

对象实例化过程:

  • 检查类是否已经被加载(双亲委派)
  • 给对象分配内存空间(指针碰撞)
  • 零值初始化(false / null)
  • 设置对象头(对象分代年龄等信息)
  • 执行 <init> 方法(属性初始化,语句块和构造方法)

所以说,Boolean只是被加载了,还没有被实例化,在被实例化之前并没有分配内存,所以是 null

接下来我们可以看看 Boolean 的属性和构造方法,了解一下它如何包装 boolean

// final boolean类型的属性,通过构造方法注入值
private final boolean value;
​
// 构造方法 Boolean a = true 实际上就是调用这个方法
public Boolean(boolean value) {
    this.value = value;
}
​
// 构造方法
public Boolean(String s) {
    this(parseBoolean(s));
}

对于其他的属性和方法,可以自行查看都比较简单

关于 Boolean 使用过程中有一个风险点,阿里巴巴开发手册也写得非常好

简单来说就是,boolean 定义的属性一定要有值,如果 Boolean 对象值为 null,解包过程中就会出现NPE。

想象一种场景:你女票问你:你爱我吗?但你没听清。如果你是 Boolean 就会回答,我没听清(null),如果你是 boolean 就会回答,不爱了 (false)

之后就会被打。

补充:Boolean与boolean性能探究

针对Boolean与true

单纯从源码角度看不出来那个性能上更加好;大布尔也是初始化了两个static对象

源码截图如下:

写了一个测试类:测试方式(获取大布尔类型true的时间 获取小布尔类型true的时间,通过100、1000、10000、100000次 看看那个时间更少的次数更多)

测试代码如下:

public class Test {	
	/**
	 * 方法一
	 * 
	 * @return
	 */
	public static Boolean A() {
		return Boolean.TRUE;
	}
	/**
	 * 方法二
	 * 
	 * @return
	 */
	public static boolean D() {
		return true;
	}
	public static String get() {
		long i = 0L;
		long j = 0L;
		for (int n = 0; n < 100000; n++) {
			long startTime = System.nanoTime();
			D();
			long endTime = System.nanoTime();
			long booleanTime = endTime - startTime;
			
			long start = System.nanoTime();
			A();
			long end = System.nanoTime();
			long booleanca = end - start;
			
			
			if (booleanca > booleanTime) {
				i = i + 1;
			} else {
				j = j + 1;
			}
		}
		return i+" "+j;
	}
	public static void main(String[] args) {
        System.out.println("---100000次的比较结果---->"+get());
	}
}

执行结果如下图:

总结

到此这篇关于Java中Boolean和boolean区别的文章就介绍到这了,更多相关Java Boolean和boolean区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现石头剪刀布游戏

    Java实现石头剪刀布游戏

    这篇文章主要为大家详细介绍了Java实现石头剪刀布游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • mybatis某些字段无法映射成功的解决

    mybatis某些字段无法映射成功的解决

    这篇文章主要介绍了mybatis某些字段无法映射成功的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • SpringBoot中的PropertySource原理详解

    SpringBoot中的PropertySource原理详解

    这篇文章主要介绍了SpringBoot中的PropertySource原理详解,PropertySource 是一个非常重要的概念,它允许您在应用程序中定义属性,并将这些属性注入到 Spring 环境中,需要的朋友可以参考下
    2023-07-07
  • 一文详解Java中的Stream的汇总和分组操作

    一文详解Java中的Stream的汇总和分组操作

    这篇文章主要为大家详细介绍了Java8中的Stream的汇总和分组的操作,文中的示例代码讲解详细,对我们学习Java有一定帮助,需要的可以参考一下
    2022-09-09
  • springboot lua检查redis库存的实现示例

    springboot lua检查redis库存的实现示例

    本文主要介绍了springboot lua检查redis库存的实现示例,为了优化性能,通过Lua脚本实现对多个马戏场次下的座位等席的库存余量检查,感兴趣的可以了解一下
    2024-09-09
  • JAVA泛型之泛型方法的定义和使用方式

    JAVA泛型之泛型方法的定义和使用方式

    这篇文章主要介绍了JAVA泛型之泛型方法的定义和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Spring DevTools的介绍

    Spring DevTools的介绍

    今天小编就为大家分享一篇关于Spring DevTools的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 带你了解Java中的异常处理(上)

    带你了解Java中的异常处理(上)

    这篇文章主要介绍了Java异常处理的相关资料,帮助大家更好的理解和学习java,感兴趣的朋友可以了解下
    2020-08-08
  • Shiro:自定义Realm实现权限管理方式

    Shiro:自定义Realm实现权限管理方式

    这篇文章主要介绍了Shiro:自定义Realm实现权限管理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java如何通过ssh远程连接主机并执行命令

    Java如何通过ssh远程连接主机并执行命令

    这篇文章主要介绍了Java如何通过ssh远程连接主机并执行命令问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论