`
pengzhoushuo
  • 浏览: 12504 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

JDK源码研究之1(Lang包拾遗)

阅读更多
1、基本类型对应的对象类型:我们知道在Java中基本类型有:void byte char double float integer long short
其对应的对象类型分别为:Void Byte Character Double Float Integer Long Short,其实在这些类中都有一个final类型的基本类型成员,如
Byte类里面有个成员private final byte value,由于其成员是final的,所以一个Byte只有在其始化的时候指定值,其后便不可改变。
在对象类型里取得其对应的基本类型是通过native实现的 (Class<Byte>) Class.getPrimitiveClass("byte")来取得的。
有意思的是:在JDK1.5之后在每一个对象类型里面都缓存了-128 - 127的对应的对象类型,所部只需要调用其静态方法valueOf(byte b)(缓存仅供该方法使用),如果其参数范围在缓存提供的范围内,但不再
New Byte()而是从缓存中取得预先New的Byte。

2、作为所有对象的"始祖",Object类具有的一些重要的方法,如getClass hashCode clone notify notifyAll wait 方法都是native的。所以你在调用这些方法的时候应该知道,你调用的是虚拟机级别的原生程序。

3、Class类,在Java里包括基本数据类型都是一个Class如int 其实也是一个Class,在反射中这个类得到了大量的应用,其实其内部的重要方法如:forName isInstance isArray isPrimitive getName getSimpleName getDeclaredFields getDeclaredMethods getDeclaredConstructors
都是native的,也就是说在虚拟级级别已经实现了这些东西。为什么Java支持反射,其实说白了也是这个Class的存在,每一个类都有其对应的元数据的存在,存在JVM中的元数据信息可以通过native方法来获取。反射其实说白了也是像传说中的那么高深,如果让我来实现基于JAVA的KAVA语言的虚拟机
(假设条件成立),那么我会在编译期间把这个类的一些描述信息,如有多少个字段呀,字段名呀etc.存放进一个我用java实现的数据结构中,然后KAVA通过调用JAVA程序来取得那些信息,其实这跟反射一样的道理。

4、有关String,其实String内部就是final char[],因为它是final的,所以如果要改变它内部的字符,得新建一个String。如果想创建新的对象而又想让字符串作改变
就得使用在JDK1.5之后加入的一个类StringBuilder,这个类忽略了线程同步所以比StringBuffer具有更高的效率。另外关于String不提的是类似String a="abc"; String b= "abc";的做法,由于"abc"在编译期间就已经确实了,所以
JVM只会保留一份"abc",这根本也不是什么很高深的东东,任何一个学过编译原理的同学都知道这是任何一个编译器优化时必须做的事情。知道了String这个"轮子"的底层后,你是否在后悔你写了N多个大量应用String相加的程序呢?
如果这些字符具有前后顺序那换成StringBuilder.append方法吧。至于String.format方法经过测试,效率甚至还不如字符串相加。

5、一些重要的基础接口,如Cloneable Comparable Iterable、Readable Runnable,得益于面向接口编程的威力,底下有N个实现呀

6、一些预定义的annotation如: Deprecated Override SuppressWarnings 这些标注在1.5以后的编程中也是时有应用。

7、与线程有关的Thread ThreadGroup 其内部主要的方法也是native的。还有一个ThreadLocal其实也并不是什么创新,只是让不同的线程操作不同的备份,操作系统原理上有。

8、与数学有关的Math StrictMath都是一些静态方法的运用,主要用来进行数据计算。

9、Enum这个1.5之后才加上去的功能相当好用,其实其内部只不过是维护了枚举的名字和其顺序,如enum A{BOY,GIRL},其实BOY便是它的name,其顺序为1(或许是0),GIRL也是name,顺序为2(或许是1);
这个类是不能够被实例化的,只能免通过声明关键字enum来建枚举,你可以在程序中取得每个枚举的集合,并不是因为API提供了该接口,而是因为枚举在创建的时候编译器还会做一些"手脚"。


10、异常层次 如下:

Throwable ---->
Error
Exception
---->RuntimeException

值得注意的是,在SUN规定的标准里,RuntimeException是不要求进行try...catch的,当你正在做一个组件供他人调用,而又不希望他人使用try...catch的方式来使用你的
组件的时候,就可以抛出一个RuntimeException或其子类的异常。


11、一些不常用,但能够提供非常有用的功能的类
Process与ProcessBuilder创建进程,如果你想要利用ipconfig命令得到网卡参数就可以通过它
Runtime可以取得程序运行环境的一些东东,如主机CPU个数、内存容量大小等信息。
System不用说了,可以取得out,in,errr流,1.5之后加了一个console主要是用于方便控制台编程的
management包,通过ManagementFactory可以取得包括编译器,操作系统管理bean从而得到如操作系统架构等信息。不过该包里只包含了众多管理bean的接口,实现类在com.sun.management。
分享到:
评论
2 楼 pengzhoushuo 2010-10-09  
确实漏了boolean,但是void可以算作是一个基本类型,你可以查下jdk源码。
1 楼 zhangyou1010 2010-10-08  
1、基本类型对应的对象类型:我们知道在Java中基本类型有:void byte char double float integer long short

写错了吧,integer不是基本类型,void也不是,另外少了boolean类型。

相关推荐

    jdk源码 jdk源码

    jdk源码, jdk源码 jdk源码, jdk源码, jdk源码, jdk源码 jdk源码 jdk源码 jdk源码

    JDK源码包(包含sun包下的源码)

    jdk安装后,里面会带有一个src.zip的文件,但文件中没有sun包下的源码,因此需要单独下载。本上传资源的JDK源码文件包含sun包下的源码。

    jdk源码-补充缺少sun包下的源码

    jdk1.7 自带源码,并补充缺少sun包下的源码,补充源码来自1.7 openjdk

    自己重新编译的jdk源码jar包

    对于想了解JDK源码的朋友来说,通过调试JDK源码来学习是一个常用的方法。但是默认的情况下eclipse是不支持进入jdk源码中进行调试和显示当前变量的。 我们要明白在jdk中,sun对rt.jar中的类编译时,去除了调试信息,这样...

    JDK1.7源码包

    JDK1.7源码包JDK1.7源码包JDK1.7源码包JDK1.7源码包JDK1.7源码包

    jdk源码包jdk-11.0.1

    jdk源码包

    JDK7源码 包含rt.jar包下的 sun包源码 sun.security包等源码

    JDK7源码 包含rt.jar包下的 sun包源码 sun.security包等源码

    jdk8源码包

    该压缩包中放的是jdk8的源码包,把该资源导入eclipse中就可看到jdk的源码!

    java JDK 源码

    java JDK 源码java JDK 源码java JDK 源码java JDK 源码java JDK 源码java JDK 源码java JDK 源码

    jdk1.6 源码jdk1.6 源码

    jdk1.6 源码

    java的jdk源码包

    第一步:安装完jdk之后,打开jdk所在目录,里面有个src.zip,这就是此jdk的所有源码 第二步:找到之后我们开始导入,选中项目点击右键,选中Build Path栏中的Configure Build Path,在Libraries中我们打开JRE ...

    JDK源码(sun包)

    JDK源码(sun包),版本jdk1.5,可用于关联查看源码。

    JDK1.8 sun 包源码

    安装完JDK后,会在%JAVA_HOME% /jdk文件夹下生成一个src.zip,此文件夹对应rt.jar中的java源码,但细心研究后发现rt.jar中sun包下的文件不存在,也就是说sun包下的java源码并没有打包到src.zip中,可以到...

    jdk1.8源码,包含sun包

    jdk1.8的源码,包含sun包中的代码。直接下载的jdk中的src似乎没有sun包的源码。

    jdk 7 源码。含sun包下所有源码

    jdk 7 源码。含sun包下所有源码。其他版本jdk也可下载学习

    jdk1.7 jdk1.8源码包

    JDK1.7,JDK1.8源码包 经常需要看JDK的源码,看了一下,别人提供的源码包需要50积分才能下载。本机刚刚好安装了两个版本的源码1.7 和 1.8 就免费共享给大家咯

    jdk-8u60源码

    jdk 8u60 源码下载: 导入请阅读IMPORT_README Main: sun.misc.Launcher

    jdk源码(完整版)

    jdk源码(完整版)。最新最全的jdk源码,网上基本上都是阉割版的

    JDK源码阅读笔记

    JDK源码阅读笔记

Global site tag (gtag.js) - Google Analytics