我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中Boolean和boolean的区别详析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 {	
	
	public static Boolean A() {
		return Boolean.TRUE;
	}
	
	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区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中Boolean和boolean的区别详析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中Boolean和boolean的区别是什么

这篇“Java中Boolean和boolean的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中Boole
2023-07-02

mysql中bit和boolean类型的区别是什么

在MySQL中,BIT和BOOLEAN类型都用于存储逻辑值,但它们有一些区别。BIT类型:BIT类型用于存储比特位,可以存储多个比特位。BIT类型的存储空间取决于指定的长度,可以是1位到64位。BIT类型可以存储0或1,或者使用b’0’
mysql中bit和boolean类型的区别是什么
2024-04-09

Java中POST、GET、@RequestBody和@RequestParam区别详析

在前后端传json数据进行交互的时候,同学们会经常用到的两个注解,@RequestBody和@RequestParam主要是用来接收前端传给后端的json数据,下面这篇文章主要给大家介绍了关于Java中POST、GET、@RequestBody和@RequestParam区别的相关资料,需要的朋友可以参考下
2022-11-13

Java泛型中<?>和<T>的区别浅析

<T>和<?>的区别<T>是参数类型,常常用于泛型类或泛型方法的定义,下面这篇文章主要给大家介绍了关于Java泛型中<?>和<T>区别的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
2022-12-19

Java properties 和 yml 的区别解析

properties和yml都是Spring Boot支持的两种配置文件,它们可以看做Spring Boot在不同时期的两种“产品”,这篇文章主要介绍了Java properties 和 yml 的区别,需要的朋友可以参考下
2023-02-17

java中 String和StringBuffer的区别实例详解

java中 String和StringBuffer的区别实例详解String: 是对象不是原始类型. 为不可变对象,一旦被创建,就不能修改它的值. 对于已经存在的String对象的
2023-05-31

基于Java中throw和throws的区别(详解)

系统自动抛出的异常所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。语句抛出的异常用户程序自定义的异常和应用程序特定的异常,必须
2023-05-31

Android中的Dalvik和ART详解及区别分析

要想知道Dalvik和ART区别分析,首先我们要分别知道这两者是什么? 什么是Dalvik? Dalvik是Google公司自己设计用于Android平台的虚拟机。 Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台
2022-06-06

exit和atexit的区别详细解析

以下是对exit与atexit的区别进行了详细的分析介绍,需要的朋友可以过来参考下
2022-11-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录