网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.JavaSE 6基于JSR105的XML签名之实.
.错误的堆大小产生的 “堆问题”.
.Web框架对比: Wicket .
.对于Java消息服务中常见问题的解.
.DAO及factory示例.
.随机数 获取背景音乐.
.浅谈Hibernate获得成功的十大理由.
.学习java&xml心得(2).
.Spring事务处理及其AOP框架的内幕.
.SSO各产品单点登录的简单实现.
..NET与J2EE融合 JNBridgePro3.0发.
.怎样锁右键,和解开右键?.
.用Java访问SQL Server 2000数据库.
.用JavaBean数据组件集成JSF应用程.
.Eclipse的图形化工具加速BTT5.1.
.J2ME游戏开发中如何使用层的概念.
.java.net 操练.
.JDK6.0新特性:Desktop和SystemTr.
.DB2 J2EE开发成本收益分析(三).
.一个JDBC订购系统原型.

JDK源码分析:java.lang.Boolean

发表日期:2008-1-5


闲来无事,开始研究JDK源码(jdk 1.5 b2),先找了一个最简单的Java.lang.Boolean开始解剖。

由于水平有限,难免有不少错误,还请大家指正!

首先我们剔除所有的方法和静态变量,Boolean的核心代码如下:

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

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

Boolean的构造函数有两个:

public Boolean(boolean value) {
    this.value = value;
}
public Boolean(String s) {
    this(toBoolean(s));
}

都很简单就不多说了。

另外注重到Boolean类实际上只有两种不同状态的实例:一个包装true,一个包装false,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出来。虽然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;
}


上一篇:在JAVA中连接Sybase数据库 人气:949
下一篇:使用DOM解析器解析XML 人气:1185
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐