thinking in java 读书笔记(六)

第八章--对象的容纳
    第七章让我感到艰难,以为后面也是,顿生挫折感,虽然知道这正是进步的开始,但是负面情绪很难摆脱。没想到这章,这么不给力。
     如果你读过JDK util包的源码,这章简直就是小儿科,util包下面的集合类,在iteye上很多人都写过分析,一些甚至靠这个分析出了书,比如那本 分布式java应用,占据了很大一部分内容,就是测试每个集合的性能,想想就觉得我的钱真给糟蹋了,if是国内的书,那么一些牛人推荐的书不一定是好书。
不过util里面还是有很多细节的,目前自己就看了几个常用的类,这里面提到的旧版本的集合类,基本就没看过。比如那个BitSet


作者提出:
引用

  我们的程序需要根据程序运行时才知道的一些标准创建新对象。若非程序正式运行,否则我们根本不
知道自己到底需要多少数量的对象,甚至不知道它们的准确类型。为了满足常规编程的需要,我们要求能在
任何时候、任何地点创建任意数量的对象。


    首先用java内置的方式数组解决,但是数组本身存在问题,是一种运行期检查,越界只有在运行期发会发现,而且没有相关的好操作的方法。若能创建和访问一个基本数据类型数组,那么比起访问一个封装数据的集合,前者的效率会高出许多.effective java 提出 能使用基本类型就尽量使用基本类型
    什么时候用集合,什么时候用数组,集合什么时候写上泛型,泛型带来的额外编程支出是否值得?
    参考http://aladdin.iteye.com/blog/40898

引用

数组是JAVA语言内置的数据类型,它是一个线性的序列,所以它可以快速的访问其他的元素。但是速度是要有代价的,当你创建了一个数组之后,它的容量就固定了,而且在其生命周期里是不能改变的。还有一点,JAVA里面的数组是会做边界检查的,所以当你越界访问时,会抛出RuntimeException,所以不用担心在C或C++因为不做边界检查而出现的问题了,当然边界检查是以牺牲效率为代价的。数组与其它容器类的区别体现在三个方面:效率、类型识别和可以持有primitives。
     JAVA里面提供的其他容器还包括List,Set和Map。他们处理对象的时候就好像这些这些对象都没有自己的类型一样,容器将它所含的元素都看成是JAVA中所有类的根类Object类型的,这样我们只需创建一种容器,就能把所有的类型的对象全部放进去。但是当取出的时候,那就需要我们自己进行类型转换了,不过在JAVA Tiger版里面新引入了“泛型”的概念,结合容器类一起使用就可以解决类型转换的问题,关于“泛型”这就不详细讲解了。从上面的角度来看,这种做法很不错,但是就是苦了primitives,如果是常量的话,可以把primitive转换成wrapper类然后放进容器里面,如果是变量的话,那就只能放在你自己的类里了。与其他容器类相比,数组会在编译的时候作类型检查,从而防止你插入错误类型的对象,或者在提取对象的时候把对象的类型给搞错了,JAVA在编译和运行的时候都能阻止你将一个不恰当的消息传给对象。至于效率,数组无疑是要高于其他容器类的,因为有些容器类的实现就是基于数组的,比如ArrayList。不论从类型检查还是效率的角度来考虑,我们首选数组来作为容器都是没错的,但是数组的缺点就是功能太弱了,所以才会有容器类的出现




      Vector 里面有一个Enumeration的nested class,如上一章分析的匿名类一样
nested class 的用法,黄金搭档effective java里面说,静态成员  非静态成员 方法内部的匿名类 局部类(可声明局部变量的地方)effective java简直就是thinking in java的黄金搭档,里面全部论述了。

      里面提到不能指定类型的问题,没有涉及到泛型这种语法糖,用组合的方式自己解决了问题。写这个文章1.5还没出,作者就感慨了c++的temple

最后:
    至于里面每个集合类,还是非常值得去看JDK源码的,坛子里面也有好多分析,感兴趣可以搜搜,我对并发包下面的集合类还不熟,要赶紧看了。





你可能感兴趣的:(java)