JDK源码Java.lang.Boolean的浅析
创始人
2024-04-13 00:00:36
0

JDK源码(jdk 1.5 b2)的研究是一个很大的范畴,那么今天先对Java.lang.Boolean开始解剖。

首先我们来看JDK源码中Java.lang.Boolean的代码,剔除所有的方法和静态变量,Java.lang.Boolean的核心代码如下:

  1. public final class Boolean implements java.io.Serializable,Comparable  
  2. {  
  3. private final boolean value;  
  4. }  

很明显,凡是成员变量都是final类型的,一定是immutable class,这个Boolean和String一样,一旦构造函数执行完毕,实例的状态就不能再改变了。

JDK源码中Java.lang.Boolean的构造函数有两个:

  1. public Boolean(boolean value) {  
  2. this.value = value;  
  3. }  
  4. public Boolean(String s) {  
  5. this(toBoolean(s));  
  6. }  

都很简单就不多说了。

另外注重到Java.lang.Boolean类实际上只有两种不同状态的实例:一个包装true,一个包装false,Java.lang.Boolean又是immutable class,所以在内存中相同状态的Boolean实例完全可以共享,不必用new创建很多实例。因此Boolean class还提供两个静态变量: 

  1. public static final Boolean TRUE = new Boolean(true);  
  2. public static final Boolean FALSE = new Boolean(false);   

这两个变量在Class Loader装载时就被实例化,并且申明为final,不能再指向其他实例。

提供这两个静态变量是为了让开发者直接使用这两个变量而不是每次都new一个Boolean,这样既节省内存又避免了创建一个新实例的时间开销。

因此,用

  1. Boolean b = Boolean.TRUE; 

  1. Boolean b = new Boolean(true); 

要好得多。

假如碰到下面的情况:

  1. Boolean b = new Boolean(var); 

一定要根据一个boolean变量来创建Boolean实例怎么办?

推荐你使用Boolean提供的静态工厂方法:

  1. Boolean b = Boolean.valueOf(var); 


这样就可以避免创建新的实例,不信看看valueOf()静态方法: 

  1. public static Boolean valueOf(boolean b) {  
  2. return (b ? TRUE : FALSE);  
  3. }  

 这个静态工厂方法返回的仍然是两个静态变量TRUE和FALSE之一,而不是new一个Boolean出来。虽然Java.lang.Boolean非常简单,占用的内存也很少,但是一个复杂的类用new创建实例的开销可能非常大,而且,使用工厂方法可以方便的实现缓存实例,这对客户端是透明的。所以,能用工厂方法就不要用new。

和Boolean只有两种状态不同,Integer也是immutable class,但是状态上亿种,不可能用静态实例缓存所有状态。不过,SUN的工程师还是作了一点优化,Integer类缓存了-128到127这256个状态的Integer,假如使用Integer.valueOf(int i),传入的int范围正好在此内,就返回静态实例。

hashCode()方法很希奇,两种Boolean的hash code分别是1231和1237。估计写Boolean.java的人对这两个数字有非凡偏好: 

  1. public int hashCode() {  
  2. return value ? 1231 : 1237;  
  3. }  

equals()方法也很简单,只有Boolean类型的Object并且value相等才返true:

  1. public boolean equals(Object obj) {  
  2. if (obj instanceof Boolean) {  
  3. return value == ((Boolean)obj).booleanValue();  
  4. }  
  5. return false;  
  6. }  

JDK源码Java.lang.Boolean的分析就到这里,希望可以在JDK源码Java.lang.Boolean的基础上分析其他的代码,真正掌握JDK。

【编辑推荐】

  1. 浅谈Java线程的生命周期
  2. JDK的概念、组成及JDK常用包
  3. JDK1.4在Windows下的环境配置
  4. JDK1.6在LINUX下的安装配置
  5. JDK1.5中新的语言特征浅析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...