广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中Boolean和boolean的区别详析
  • 837
分享到

Java中Boolean和boolean的区别详析

2024-04-02 19:04:59 837人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言类加载机制:对象实例化过程:补充:Boolean与boolean性能探究总结前言 ​上次一个同学问,Boolean 类型的值不是只有 true 和 false 两种吗?为什么

前言

​上次一个同学问,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区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中Boolean和boolean的区别详析

本文链接: https://www.lsjlt.com/news/154215.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java中Boolean和boolean的区别详析
    目录前言类加载机制:对象实例化过程:补充:Boolean与boolean性能探究总结前言 ​上次一个同学问,Boolean 类型的值不是只有 true 和 false 两种吗?为什么...
    99+
    2022-11-13
  • Java中Boolean和boolean的区别是什么
    这篇“Java中Boolean和boolean的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中Boole...
    99+
    2023-07-02
  • Java详细解析==和equals的区别
    目录1、== 解析2、equals 方法解析3、equals方法具有以下特性1、== 解析 == 常用于相同的基本数据类型之间的比较,也可用于相同类型的对象之间的比较; 如...
    99+
    2022-11-13
  • Java中POST、GET、@RequestBody和@RequestParam区别详析
    目录@RequestParam@RequestBody后端解析json数据POST请求时总结参考:@RequestParam 注解@RequestParam接收的参数是来自HTTP请...
    99+
    2022-11-13
    post get区别 @requestbody和@requestparam区别
  • Java中equals和==的区别详解
    目录1.java中的数据类型,可分为两类: 2.再稍微改动一下程序,会有更奇怪的发现: 3. 字符串缓冲池 4.再次更改程序: 总结1.java中的数据类型,可分为两类: 1.基本...
    99+
    2022-11-12
  • 详解Java中==和equals()的区别
    目录1. ==1.1 基本数据类型1.2 引用数据类型1.3 小结2. equals3. 总结1. == == 是运算符,用来判断两个值是否相等,==可以使用在基本数据类型变量和引用...
    99+
    2022-11-12
  • 浅析java中Pair和Map的区别
    目录核心java配对实现Pair类AbstractMap.SimpleEntry 和 AbstractMap.SimpleImmutableEntryApache CommonsVa...
    99+
    2022-11-11
  • Java中Exception和Error的区别详解
    世界上存在永远不会出错的程序吗?也许这只会出现在程序员的梦中。随着编程语言和软件的诞生,异常情况就如影随形地纠缠着我们,只有正确的处理好意外情况,才能保证程序的可靠性。 java语...
    99+
    2022-11-12
  • java中StringStringBuffer和StringBuilder的区别详解
    目录从声明定义上来谈从结构上来谈从线程安全来谈总结从声明定义上来谈 只有String 可以 直接声明创建 而 StringBuffer 与 StringBuilder 必须去new...
    99+
    2022-11-13
  • Java泛型中<?>和<T>的区别浅析
    目录一、定义1、T 代表一种类型2、是通配符,泛指所有类型二、使用1、T 一般有两种用途2、<> 的限制用途3、三种泛型限定三、总结1、从定义上看2、从用途上看补充:场景...
    99+
    2022-12-19
    java泛型?和T的区别 java 泛型 T ? Java 泛型 ?
  • Mysql中tinyint(1)和tinyint(4)的区别详析
    目录1. varchar(M)和数值类型tinyint(M) 的区别2 测试总结1. varchar(M)和数值类型tinyint(M) 的区...
    99+
    2022-11-13
  • Java 中泛型 T 和 ? 的区别详解
    目录泛型中 T 类型变量 和 通配符 区别Generic Types 类型变量用法2.声明通用的方法 – 泛型方法:有界类型参数Wildcards 通配符1.上界通配符...
    99+
    2022-11-12
  • Java properties 和 yml 的区别解析
    目录properties和yml的区别① 定义和定位不同② 语法不同③ yml更好的配置多种数据类型④ yml可以跨语言⑤ 总结properties和yml的区别 这几天刚好看到Sp...
    99+
    2023-02-17
    Java properties 和 yml Java properties 和 yml区别
  • exit和atexit的区别详细解析
    一、exit()函数函数声明:void exit(int state);exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正...
    99+
    2022-11-15
    exit atexit
  • Android中的Dalvik和ART详解及区别分析
    要想知道Dalvik和ART区别分析,首先我们要分别知道这两者是什么? 什么是Dalvik? Dalvik是Google公司自己设计用于Android平台的虚拟机。 Dalvi...
    99+
    2022-06-06
    art Android
  • Java中class和Class的区别示例详解
    目录一.class与Class区别二.Class介绍三.如何得到Class对象1.通过getClass()方法获取到Class对象2.通过forName()方法获取到Class对象3...
    99+
    2022-11-13
  • 基于Java中throw和throws的区别(详解)
    系统自动抛出的异常所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。语句抛出的异常用户程序自定义的异常和应用程序特定的异常,必须...
    99+
    2023-05-31
    java throw throws
  • java中 String和StringBuffer的区别实例详解
    java中 String和StringBuffer的区别实例详解String:           是对象不是原始类型.  &nb...
    99+
    2023-05-31
    string stringbuffer buf
  • Java中Stream流中map和forEach的区别详解
    目录什么是 stream 流MapforEach使用场景不是很难的知识,但是今天犯错了,记录一下 什么是 stream 流 我们在使用集合或数组对元素进行操作时往往会遇到这种情况:通...
    99+
    2022-11-13
  • 枚举和宏的区别详细解析
    枚举常量与宏的区别主要有几点: 1。枚举常量是实体中的一种,但宏不是实体; 2。枚举常量属于常量,但宏不是常量; 3。枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如...
    99+
    2022-11-15
    枚举
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作