java.lang解析Boolean类

2024-08-25 04:32
文章标签 java 解析 lang boolean

本文主要是介绍java.lang解析Boolean类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Boolean类:

public final class Booleanextends Objectimplements Serializable, Comparable<Boolean>

  
字段摘要
static BooleanFALSE
          对应基值 falseBoolean 对象。
static BooleanTRUE
          对应基值 trueBoolean 对象。
static Class<Boolean>TYPE
          表示基本类型 boolean 的 Class 对象。
 
构造方法摘要
Boolean(boolean value)
          分配一个表示 value 参数的 Boolean 对象。
Boolean(String s)
          如果 String 参数不为 null 且在忽略大小写时等于 "true",则分配一个表示true 值的Boolean 对象。
 
方法摘要
 booleanbooleanValue()
          将此 Boolean 对象的值作为基本布尔值返回。
 intcompareTo(Boolean b)
          将此 Boolean 实例与其他实例进行比较。
 booleanequals(Object obj)
          当且仅当参数不是 null,而是一个与此对象一样,都表示同一个 Boolean 值的 boolean 对象时,才返回 true
static booleangetBoolean(String name)
          当且仅当以参数命名的系统属性存在,且等于 "true" 字符串时,才返回 true
 inthashCode()
          返回该 Boolean 对象的哈希码。
static booleanparseBoolean(String s)
          将字符串参数解析为 boolean 值。
 StringtoString()
          返回表示该布尔值的 String 对象。
static StringtoString(boolean b)
          返回一个表示指定布尔值的 String 对象。
static BooleanvalueOf(boolean b)
          返回一个表示指定 boolean 值的 Boolean 实例。
static BooleanvalueOf(String s)
          返回一个用指定的字符串表示值的 Boolean 值。
 首先我们先定义一个CBoolean类来跟Boolean以同样的方式实现:
public class CBoolean extends Object implements Serializable,Comparable<CBoolean>{
先看字段摘要:
    /*** The {@code Boolean} object corresponding to the primitive* value {@code true}.* *对应基值 true 的 Boolean 对象。*Boolean,50行*/public static final Boolean TRUE = new Boolean(true);/*** The {@code Boolean} object corresponding to the primitive* value {@code false}.* *  对应基值 false 的 Boolean 对象。*  Boolean,56行*/public static final Boolean FALSE = new Boolean(false);/*** The Class object representing the primitive type boolean.** @since   JDK1.1* * 表示基本类型 boolean 的 Class 对象。* 由于Class.getPrimitiveClass是native方法,这里并不能实现* Boolean,64行*/
//    @SuppressWarnings("unchecked")
//    public static final Class<CBoolean> TYPE = (Class<CBoolean>) Class.getPrimitiveClass("boolean");

这里TRUE和FALSE都是被定义成了Boolean类的对象,TYPE为boolean的Class对象

下面是构造方法:

首先是定义一个boolean存储Boolean对象的值:

    /*** The value of the Boolean.* 存储Boolean的值* Boolean,71行* @serial*/private final boolean value;

这个值是final类型的,也就是说在value初始化之后值是不可变的。

然后是构造方法的实现:

    /*** 构造方法,设置Boolean类的值* Boolean,87行* @param value*/public CBoolean(boolean value) {this.value = value;}

第一个构造方法比较简单,直接把传入的boolean值传进来就行了。

然后是第二种:

    /*** 构造方法,实际调用的是CBoolean(boolean value)方法* @param s*/public CBoolean(String s) {this(parseBoolean(s));}/*** 判断传入的字符串是否和true相等,返回boolean值* Boolean,121行* @param s* @return*/public static boolean parseBoolean(String s) {return ((s != null) && s.equalsIgnoreCase("true"));}

第二种是传入一个String类型的对象,判断是否和true相等,然后返回对应的boolean值,关于equalsIgnoreCase的使用,我们在解析String的时候再说吧,下一篇就说一下String。

下面是方法摘要:

booleanValue方法:

    /*** 返回Boolean对象的值* Boolean,131行* @return*/public boolean booleanValue() {return value;}

直接返回Boolean对象当中存的boolean值

compareTo方法:

	/*** 将此Boolean实例和其他实例比较* Boolean,273行*/@Overridepublic int compareTo(CBoolean b) {return compare(this.value, b.value);}/*** 将x,y值进行比较,相等返回0,不等时x为true返回1,为false返回-1* Boolean,290行* @param x* @param y* @return*/public static int compare(boolean x, boolean y) {return (x == y) ? 0 : (x ? 1 : -1);}
将x,y值进行比较,相等返回0,不等时x为true返回1,为false返回-1

equals方法:

    /*** 当且仅当参数不是 null,而是一个与此对象一样,都表示同一个 Boolean 值的 boolean 对象时,才返回 true。* Boolean,225行*/public boolean equals(Object obj) {if (obj instanceof Boolean) {return value == ((Boolean)obj).booleanValue();}return false;}
在Object类中我们知道equals的方法实现是这样的:

public boolean equals(Object obj) {  // TODO Auto-generated method stub  return (this == obj);  
} 
在Boolean类里面,对equals方法进行了复写,判断Boolean里面存储值的value变量是否相等。

getBoolean方法:

    /***   当且仅当以参数命名的系统属性存在,且equals传入的字符串name为true时,才返回 true。* Boolean,251行* @param name* @return*/public static boolean getBoolean(String name) {boolean result = false;try {result = parseBoolean(System.getProperty(name));} catch (IllegalArgumentException | NullPointerException e) {}return result;}

这个getBoolean方法的JDK1.6API中文文档的翻译上有问题,英文文档解释是:

    /**
     * Returns {@code true} if and only if the system property
     * named by the argument exists and is equal to the string
     * {@code "true"}. (Beginning with version 1.0.2 of the
     * Java<small><sup>TM</sup></small> platform, the test of
     * this string is case insensitive.) A system property is accessible
     * through {@code getProperty}, a method defined by the
     * {@code System} class.

/

翻译的结果是:当且仅当以参数命名的系统属性存在,且等于 "true" 字符串时,才返回 true

正确的理解应该是:当且仅当以参数命名的系统属性存在,且equals传入的字符串name为true时,才返回 true。

如果要让返回值为true,首先要添加一个参数到系统属性里面,具体情况可以后面测试结果。

hashCode方法:

在Object类里面,hashCode方法是native的,而Boolean类里面是这样实现的:

    /*** 返回该 Boolean 对象的哈希码。* Boolean,199行*/@Overridepublic int hashCode() {return Boolean.hashCode(value);}/*** Returns a hash code for a {@code boolean} value; compatible with* {@code Boolean.hashCode()}.** @param value the value to hash* @return a hash code value for a {@code boolean} value.* @since 1.8* * 返回该 Boolean 对象的哈希码。* Boolean,212行*/public static int hashCode(boolean value) {return value ? 1231 : 1237;}
也就是说boolean值为true的Boolean对象的hashCode一定为1231,false为1237,还有一个前提,这个是JDK1.8以后实现的方法。

parseBoolean方法:

    /*** 判断传入的字符串是否和true相等,返回boolean值* Boolean,121行* @param s* @return*/public static boolean parseBoolean(String s) {return ((s != null) && s.equalsIgnoreCase("true"));}
判断字符串是否和true相等,返回boolean值,这个前面说过了。

toString方法:

    /*** 返回表示该布尔值的 String 对象* Boolean,188行*/public String toString() {return value ? "true" : "false";}

    /*** 返回表示该布尔值的 String 对象* Boolean,176行* @param b* @return*/public static String toString(boolean b) {return b ? "true" : "false";}
相当于是直接吧Boolean对象转化为对应的“true”和“false”String对象,跟当前的Boolean值是没有任何关系的

valueof方法:

    /*** 根据boolean值返回Boolean对象* @param b* @return*/public static CBoolean valueOf(boolean b) {return (b ? TRUE : FALSE);}/*** 返回一个用指定的字符串表示值的 Boolean 值。* 如果字符串不为"true"返回的都是 FALSE Boolean对象* @param s* @return*/public static CBoolean valueOf(String s) {return parseBoolean(s) ? TRUE : FALSE;}

下面测试方法:

测试过程中发现一个问题,如下:

		boolean b;Boolean a = b = true;System.out.println(a.booleanValue());
我们发现这段代码运行是没有任何问题的,打印出来的结果也是true,但是会发现true是一个 boolean变量也是一个关键字,是一个基本数据类型,而Boolean是一个类,怎么能够直接把一个基本数据类型赋值给一个类呢?这个是不是有些问题呢?我回头看了一下代码,发现里面有这么一段:

    /*** The Class object representing the primitive type boolean.** @since   JDK1.1* * 表示基本类型 boolean 的 Class 对象。* 由于Class.getPrimitiveClass是native方法,这里并不能实现* Boolean,64行*/
//    @SuppressWarnings("unchecked")
//    public static final Class<CBoolean> TYPE = (Class<CBoolean>) Class.getPrimitiveClass("boolean");

这里面应该是通过这个Class.getPrimitiveClass方法来实现的,在Class中,方法如下:
    /** Return the Virtual Machine's Class object for the named* primitive type.*/static native Class<?> getPrimitiveClass(String name);

也就是说这个方法可以返回当前基本数据类型的对象。

测试booleanValue方法:

	public static void main(String args[]){CBoolean cBoolean = new CBoolean(true);//因为不能使用getPrimitiveClass方法,所以只能这样初始化
//		test();testBooleanValue(cBoolean);}


先初始化一个cBoolean对象,并且赋值为true,

	/*** 测试booleanValue方法* @param cBoolean*/public static void testBooleanValue(CBoolean cBoolean){System.out.println(cBoolean.booleanValue());}

测试结果是打印为true

测试compareTo方法:

    /*** 测试compare方法* @param cBoolean*/public static void testCompare(){//定义一个false的CBoolean对象CBoolean booleanFalse = new CBoolean(false);//定义一个true的CBoolean对象CBoolean booleanTrue = new CBoolean(true);//打印输出结果testCompareTo(booleanTrue,booleanTrue);testCompareTo(booleanTrue,booleanFalse);testCompareTo(booleanFalse,booleanTrue);testCompareTo(booleanFalse,booleanFalse);}/*** 测试comareTo的结果* @param from* @param to*/public static void testCompareTo(CBoolean from,CBoolean to){System.out.println(String.format("from:%s,to:%s,result:%s", from.booleanValue(),to.booleanValue(),from.compareTo(to)));}

结果为:

 将from,to值进行比较,相等返回0,不等时from为true返回1,为false返回-1

测试equals、getBoolean、hashCode和parseBoolean方法:

 /***测试equals、getBoolean、hashCode和parseBoolean方法: *@param cBoolean*/public static void test4Function(){//定义一个值为true的CBoolean对象CBoolean booleanTrue = new CBoolean(true);//定义一个值为false的CBoolean对象CBoolean booleanFalse = new CBoolean(false);//测试equals方法testEquals(booleanTrue,booleanTrue);testEquals(booleanTrue,booleanFalse);//测试getBoolean方法testGetBoolean("true",false);testGetBoolean("true",true);testGetBoolean("oathchen",false);testGetBoolean("oathchen",true);//测试hashCode方法testHashCode(booleanTrue);testHashCode(booleanFalse);//测试parseBoolean方法testParseBoolean(null);testParseBoolean("true");testParseBoolean("false");}/*** 测试equals方法* @param from* @param to*/public static void testEquals(CBoolean from,CBoolean to){System.out.println(String.format("euqals from:%s,to:%s,result:%s", from.booleanValue(),to.booleanValue(),from.equals(to)));}/**
* 测试getBoolean方法
* @param cBoolean
* @param isSetProperty 是否设置成系统属性
*/
public static void testGetBoolean(String str,Boolean isSetProperty){
if(isSetProperty)
System.setProperty(str, "true");
System.out.println(String.format("getBoolean str:%s,isSetProperty:%s,getBoolean:%s", str,isSetProperty,CBoolean.getBoolean(s	tr)));
}/*** * 测试hashCode方法* @param cBoolean*/public static void testHashCode(CBoolean cBoolean){System.out.println(String.format("hashCode Boolean值:%s,hashCode:%d",cBoolean.booleanValue(),cBoolean.hashCode()));}/*** 测试ParseBoolean方法* @param str*/public  static void testParseBoolean(String str){System.out.println(String.format("parseBoolean str:%s,result:%s", str,CBoolean.parseBoolean(str)));}
测试结果为:


当使用equals方法的时候,只有from和to的boolean值相同的时候才会返回true

getBoolean方法是判断系统内部的变量键值对的”值“是否为true,getBoolean方法参数相当于是键值对的”键“,传入“true”字符串并不会使得返回结果为true。

hashCode说过了,在JDK1.8之后,Boolean对象的boolean值为true的实例hashCode一定为1231,为false的hashCode一定为1237

parseBoolean判断传入的字符串是否和true相等,返回boolean值

测试toString和valueOf方法:

 /*** 测试toString和valueOf* @param cBoolean*/public static void test2StringAndValueOf(){//定义一个值为true的CBoolean对象CBoolean booleanTrue = new CBoolean(true);//定义一个值为false的CBoolean对象CBoolean booleanFalse = new CBoolean(false);//打印输出toString的结果:System.out.println(String.format("booleanTrue toString: %s", booleanTrue.toString()));System.out.println(String.format("booleanTrue toString(boolean true): %s", booleanTrue.toString(true)));System.out.println(String.format("booleanTrue toString(boolean false): %s", booleanTrue.toString(false)));//测试valueof的结果:System.out.println(String.format("valueOf(boolean true):%s", CBoolean.valueOf(true)));System.out.println(String.format("valueOf(boolean false):%s", CBoolean.valueOf(false)));System.out.println(String.format("valueOf(String true):%s", CBoolean.valueOf("true")));System.out.println(String.format("valueOf(String true):%s", CBoolean.valueOf("false")));System.out.println(String.format("valueOf(String other):%s", CBoolean.valueOf("other")));}

结果为:

toString无参方法直接返回的是当前CBoolean对象的Value值,有参方法直接返回的是参数当中传入的boolean值

valueOf方法其实没什么好说的,输入的是true,返回true,不是true的返回false,

要注意的一点是:

	System.out.println(String.format("valueOf(boolean true):%s", CBoolean.valueOf(true)));
我们这里valueOf返回的是一个CBOOlean对象,而format里面是%s,也就是说是字符串,这里是直接调用了CBoolean对象的toString方法打印出来的结果。


这篇关于java.lang解析Boolean类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104548

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2