读《Thinking in Java》第4版笔记

  1. 宏:编译器预处理,将变量替换为常量,提高程序运行效率。
    在Java中,final变量就是一个“宏变量”,编译器会把程序中所有用到该变量的地方替换成该变量的值。

  2. 书中“堆栈”(stack)是指“栈”,“堆”(heap)是指内存池或叫内存堆。
    说堆栈容易让人混淆,有必要澄清一下。

  3. 矢量(Vector)和列表(List)的区别
    Vector的底层数据结构是数组,是存储空间连续的存储结构;
    List,书中指的是像LinkedList这类链表,是不连续的存储结构。
    所以说,Vector的元素取值、修改效率较高,增加、删除效率较低;链表则相反。

  4. Java的单根结构
    所有的类默认继承Object,Object有默认的方法,例如finalize()。利用单根结构可以方便地实现垃圾收集器,利用finalize()方法。
    当垃圾回收器认为一个对象没有存在意义时,会调用该对象的finalize()方法,释放该对象在堆中占用的内存。

  5. Java规定了基本数据类型的大小。
    基本数据类型的大小,即占用空间大小,并不随着机器结构的变化而变化。这种大小的不可更改是Java 程序具有很强移植能力的原因之一。

  6. 成员变量的默认值
    如果成员变量是基本数据类型,Java会分配默认值;
    如果局部变量是基本数据类型,则不会分配默认值,需要程序初始化。

  7. 移位运算符
    左移运算符<<,低位补0;
    右移运算符>>是有符号移位运算,若值为正,则在高位补0;若值为负,则在高位补1;
    无符号右移运算符>>>,无论正负,都在高位补0。

  8. float类型初始化时,数字常量要追加f,否则与double混淆,编译报错。

  9. switch选择因子的类型可以是int, char, String等常量。
    书中说选择因子必须是int或char的整型。因为byte,short会向上转为int,所以也支持byte,short。这种说法有误,在Java 1.7以后的版本已经支持更多类型了。

  10. 默认构造方法
    如果一个类没有定义构造方法,则会生成一个无参、方法体为空的默认构造器。
    如果定义了构造方法,则不会生成这个无参、方法体为空的默认构造器,除非程序显式定义。

  11. 构造方法的使用
    构造方法只能在构造方法内被调用;
    一个构造方法内只能调用一个构造方法;
    构造方法的调用必须是方法体中的第一条语句。

  12. Java创建一个源码文件的时候,它通常叫作一个“编辑单元”。
    每个编译单元都必须有一个以.java 结尾的名字。而且在编译单元的内部,可以有一个公共(public)类,它必须拥有与文件相同的名字;
    每个编译单元内都只能有一个public 类,也可以没有。

  13. 区分组合与继承的使用场景
    用组合表达“包含”关系,用继承表达“属于”关系。

  14. 声明时未初始化的final成员变量
    如果一个finial成员变量在声明时未进行初始化,则需要在构造方法中将其初始化。

  15. final方法的意义
    可禁止继承类修改;
    编译器可以将final方法嵌入调用方法内,避免方法调用时的系统开销,提升效率;
    不是final的方法,则动态绑定,即在程序运行时才知道具体调用哪个方法(结合Java多态理解);
    private的方法默认为final方法,即自动编译为final。

  16. final类中的所有方法默认为final。

  17. 每个对象的代码都存在于独立的文件中。除非真的需要,否则那个文件不会载入。

  18. 抽象类不能实例化。

  19. 接口的方法默认是public,可以不明确声明为public,但是不可以声明为其他可见形式。

  20. 类只能单继承某个类,可以实现多个接口;接口与接口之间可以多继承。

  21. 用抽象类还是接口?
    如果事先知道某个类会成为基础类,那么第一个选择就是把它变成一个接口。只有在必须使用方法定义或者成员变量的时候,才应考虑采用抽象类。

  22. 注意根据Java 命名规则,static final修饰的基本数据类型(亦即编译期常数)应全部采用大写字母(用下划线分隔单个标识符里的多个单词)。

  23. 字段的初始化时机是在类加载时,也就是在访问字段之前就初始化了。
    static字段和代码块会先于非static字段和代码块加载。静态变量和静态代码块的加载顺序由编写先后决定。

  24. 内部类因为有外部类的引用,可以直接访问外部类的成员变量,private也可以。这是编译器帮我们实现的。

  25. 由于C++的vector不进行范围检查,所以访问速度较快——在Java 中,由于对数组和集合都要进行范围检查,所以对性能有一定的影响。

  26. 自动转换字符串技术
    一旦编译器碰到一个字串,后面跟随一个“+”,就希望后面又跟随一个字串。这里编译器对“+”的处理是创建一个StringBuilder对象,用append()方法拼接两个字符串。
    如果+的后面是一个对象,那么自动调用append(Object obj),底层方法是obj.toString();如果+的后面是基本数据类型,就调用append(相应数据类型)。

  27. TreeSet是用红黑树排序的有序Set。

  28. 创建不可修改的集合对象。

Collection c = new ArrayList();
...
c = Collections.unmodifiableCollection(c);

Map m = new HashMap();
...
m = Collections.unmodifiableMap(m);
  1. 创建线程安全的集合对象
Collection c = Collections.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());
Set s = Collections.synchronizedSet(new HashSet());
Map m = Collections.synchronizedMap(new HashMap());

实现线程安全的原理是,方法用了synchronized关键字。

  1. Throwable 对象有两种常规子类。其中,Error 代表编译期和系统错误,我们一般不必特意捕获它们(除在特殊情况以外);Exception 是可以从任何标准Java 库的类方法中抛出的基本类型。

  2. 自定义异常类

class MyException extends Exception {
    public MyException() {}
    public MyException(String msg) {
         super(msg);
    }
}
  1. 对象序列化可将对象转换成一系列字节,并可完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。

为防止对象的敏感部分被序列化,一个办法是将类实现Externalizable。这样,没有任何东西可以自动序列化,只能在writeExternal()明确序列化那些需要的部分;
若操作的是一个Serializable 对象,所有序列化操作都会自动进行。为解决这个问题,可以用transient逐个字段地关闭序列化。

  1. Class的newInstance()方法是克隆clone()一个对象的另一种手段。
    两者是有区别是,利用newInstance()可在没有现成对象供“克隆”的情况下新建一个对象。

  2. protected修饰的成员或方法的可见性,要分子类和超类是否在同一个包中。
    与基类不在同一个包中的子类,只能访问自身从基类继承而来的受保护成员,而不能访问基类实例本身的受保护成员。在相同包时,protected和public是一样的。

  3. 实现Cloneable接口的意义
    一个类的对象能调用clone()方法的前提是实现了Cloneable接口,然而Cloneable接口没有定义方法。实现Cloneable接口的意义是:
    可用instanceof关键字判断对象是否能够克隆;

if(myHandle instanceof Cloneable)

对于不想被克隆的对象可以抛出CloneNotSupportedException异常。

protected native Object clone() throws CloneNotSupportedException;
  1. String是final类
    String一旦修改,就返回一个新的String对象。若内容没有改变,则只返回指向原来那个String的引用。
    声明为final是不想被修改,作为工具类一来效率会提升,再者提高了安全性。因为底层代码调用了本地方法,与操作系统交互,如果可以随意改,势必降低安全性。

  2. 线程的四个状态:创建、阻塞、运行、死亡。

  3. 线程的优先级意味着线程的“重要程度”。
    若线程的优先级较低,只不过表示它被准许运行的机会小一些而已。

  4. 线程组中的线程可以修改组内的其他线程;我们只能降低一个线程组的最大优先级,而不能提高它;一个子组的最大优先级在任何时候都只能低于或等于它的父组的最大优先级。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,582评论 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,629评论 0 11
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,046评论 0 4
  • 喜欢上你真是件糟糕的事 就像一只候鸟恋上北国的冬季 她愿意收拢跋涉万里的双翼 在风雪里静静死去 雪花不会为她唱首安...
    南浔的书阅读 179评论 1 4
  • 这个城市也下雨了 有了些许的寒意 太久没有寒冷的季节 有时也会盼望冬季 盼望冬季里原本该有的饥寒和萧瑟 只有这些 ...
    小小绿儿阅读 483评论 0 3