您好,欢迎访问一九零五行业门户网

Java中Boolean和boolean的区别是什么

前言有人问,boolean 类型的值不是只有 true 和 false 两种吗?为什么他定义的属性出现了 null 值?
我们应该先明确一点,boolean 是 java 的基本数据类型,boolean 是 java 的一个类。boolean 类型会在“赋零值”阶段给属性赋 false。而 boolean 是一个类,会在“赋零值”阶段给对象赋 null。
如果是静态属性,会在类加载时被赋值。如果是普通类属性,会在实例化对象时赋值。这两点可以了解一下“类加载机制”和“对象创建过程”。
类加载机制:加载:根据类的全名获取类的二进制字节流,将类加载进内存并在堆中生成一个代表这个类的 class 对象,作为方法区数据的访问入口
验证:验证 class 文件中的字节流是否符合 jvm 规范
准备:在方法区中为类的静态属性分配内存,并初始化默认值(boolean 的默认值是 false,boolean 的默认值是 null)
解析:将常量池中的符号引用转化为直接引用,可以理解为对象引用转成指针
初始化:真正开始执行类中的代码,静态属性赋值和静态块
对象实例化过程:检查类是否已经被加载(双亲委派)
给对象分配内存空间(指针碰撞)
零值初始化(false / null)
设置对象头(对象分代年龄等信息)
执行 7e51f00a783d7eb8f68358439dee7daf 方法(属性初始化,语句块和构造方法)
所以说,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的区别是什么的详细内容。
其它类似信息

推荐信息