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);
29. 创建线程安全的集合对象
- 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 关键字
30.Throwable 对象有两种常规子类其中, Error 代表编译期和系统错误, 我们一般不必特意捕获它们(除在特殊情况以外);Exception 是可以从任何标准 Java 库的类方法中抛出的基本类型
31. 自定义异常类
- class MyException extends Exception {
- public MyException() {}
- public MyException(String msg) {
- super(msg);
- }
- }
32. 对象序列化可将对象转换成一系列字节, 并可完全恢复回原来的样子这一过程亦可通过网络进行这意味着序列化机制能自动补偿操作系统间的差异
为防止对象的敏感部分被序列化, 一个办法是将类实现 Externalizable 这样, 没有任何东西可以自动序列化, 只能在 writeExternal()明确序列化那些需要的部分;
若操作的是一个 Serializable 对象, 所有序列化操作都会自动进行为解决这个问题, 可以用 transient 逐个字段地关闭序列化
33.Class 的 newInstance()方法是克隆 clone()一个对象的另一种手段
两者是有区别是, 利用 newInstance()可在没有现成对象供克隆的情况下新建一个对象
34.protected 修饰的成员或方法的可见性, 要分子类和超类是否在同一个包中
与基类不在同一个包中的子类, 只能访问自身从基类继承而来的受保护成员, 而不能访问基类实例本身的受保护成员在相同包时, protected 和 public 是一样的
35. 实现 Cloneable 接口的意义
一个类的对象能调用 clone()方法的前提是实现了 Cloneable 接口, 然而 Cloneable 接口没有定义方法实现 Cloneable 接口的意义是:
可用 instanceof 关键字判断对象是否能够克隆;
if(myHandle instanceof Cloneable)
对于不想被克隆的对象可以抛出 CloneNotSupportedException 异常
protected native Object clone() throws CloneNotSupportedException;
36. String 是 final 类
String 一旦修改, 就返回一个新的 String 对象若内容没有改变, 则只返回指向原来那个 String 的引用
声明为 final 是不想被修改, 作为工具类一来效率会提升, 再者提高了安全性因为底层代码调用了本地方法, 与操作系统交互, 如果可以随意改, 势必降低安全性
37. 线程的四个状态: 创建阻塞运行死亡
38. 线程的优先级意味着线程的重要程度
若线程的优先级较低, 只不过表示它被准许运行的机会小一些而已
39. 线程组中的线程可以修改组内的其他线程; 我们只能降低一个线程组的最大优先级, 而不能提高它; 一个子组的最大优先级在任何时候都只能低于或等于它的父组的最大优先级
至此 Thinking in Java 读书笔记完结了, 但是学习依然要继续
来源: http://www.92to.com/bangong/2018/02-03/33263970.html