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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值