扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章给大家介绍如何解析JDK源码Java.lang.Boolean的浅析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
创新互联公司致力于网站建设、成都网站建设,成都网站设计,集团网站建设等服务标准化,推过标准化降低中小企业的建站的成本,并持续提升建站的定制化服务水平进行质量交付,让企业网站从市场竞争中脱颖而出。 选择创新互联公司,就选择了安全、稳定、美观的网站建设服务!
JDK源码(jdk 1.5 b2)的研究是一个很大的范畴,那么今天先对Java.lang.Boolean开始解剖。
首先我们来看JDK源码中Java.lang.Boolean的代码,剔除所有的方法和静态变量,Java.lang.Boolean的核心代码如下:
public final class Boolean implements java.io.Serializable,Comparable { private final boolean value; }
很明显,凡是成员变量都是final类型的,一定是immutable class,这个Boolean和String一样,一旦构造函数执行完毕,实例的状态就不能再改变了。
JDK源码中Java.lang.Boolean的构造函数有两个:
public Boolean(boolean value) { this.value = value; } public Boolean(String s) { this(toBoolean(s)); }
都很简单就不多说了。
另外注重到Java.lang.Boolean类实际上只有两种不同状态的实例:一个包装true,一个包装false,Java.lang.Boolean又是immutable class,所以在内存中相同状态的Boolean实例完全可以共享,不必用new创建很多实例。因此Boolean class还提供两个静态变量:
public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false);
这两个变量在Class Loader装载时就被实例化,并且申明为final,不能再指向其他实例。
提供这两个静态变量是为了让开发者直接使用这两个变量而不是每次都new一个Boolean,这样既节省内存又避免了创建一个新实例的时间开销。
因此,用
Boolean b = Boolean.TRUE;
比
Boolean b = new Boolean(true);
要好得多。
假如碰到下面的情况:
Boolean b = new Boolean(var);
一定要根据一个boolean变量来创建Boolean实例怎么办?
推荐你使用Boolean提供的静态工厂方法:
Boolean b = Boolean.valueOf(var);
这样就可以避免创建新的实例,不信看看valueOf()静态方法:
public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }
这个静态工厂方法返回的仍然是两个静态变量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的人对这两个数字有非凡偏好:
public int hashCode() { return value ? 1231 : 1237; }
equals()方法也很简单,只有Boolean类型的Object并且value相等才返true:
public boolean equals(Object obj) { if (obj instanceof Boolean) { return value == ((Boolean)obj).booleanValue(); } return false; }
关于如何解析JDK源码Java.lang.Boolean的浅析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流