Java学习札记
(1)对于ArrayList、Vector、LinkedList等List集合而言,当使用Iterator遍历他们时,如果正在遍历倒数第二个几何元素,使用List集合的remove()方法删除集合的任意一个元素并不会引发ConcurrentModificationException异常, 当正在遍历其他元素时,就会引发该异常。
对于TreeSet、HashSet等Set集合而言,当使用Iterator遍历他们时,如果正在遍历最后一个几何元素,使用Set集合的remove()方法删除集合的任意一个元素并不会引发ConcurrentModificationException异常, 当正在遍历其他元素时,就会引发该异常。
(2)当需要使用字符串,还有Byte,Short,Integer,Float,Double,Boolean,Character等包装类的实例时,程序不应该采用new的方式来创建对象,而应该直接采用直接量来创建它们。如使用String str=”Hello”;而不是String str=new String(“Hello”);
(3)对于String类而言,它代表字符串序列不可改变的字符串,因此,如果程序需要一个字符序列会发生改变的字符串,那应该考虑StringBuilder或StringBuffer(通常更优先考虑前者)。
(4)对String类型的变量,”==”比较两个字符串是否引用同一个实例对象,”equals”则比较两个字符串中对应每个字符是否相等。
(5)如果在编译Java程序时提出形如“非法字符:\xxxxx”的错误提示,那么可断该程序中包含全角字符,逐个删除即可。
(6)尽量保留循环体的花括号,否则容易出错。do,while,for不允许循环体语句为单独的局部变量赋值操作(在无花括号情况下会出错)。
(6)进行异常捕获时,一定要记住先捕获小的异常,再捕获大的异常。
(7) 无论如何不要在finally块中递归调用可能引起异常的方法,因为这将导致该方法的异常不能正常被抛出,甚至StackOverFlow错误也不能终止程序。
(8)str.getBytes().length - str.length();获取字符串中汉字的数目(无其他特殊字符)
(9)静态内部类可以有静态成员,而非静态内部类则不能有静态成员。静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量。非静态内部类的非静态成员可以访问外部类的非静态变量。
(10)局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量 (final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。
(11)任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。
(12)当一个变量被声明为泛型时,只能被实例变量和方法调用,不能被静态变量和方法调用。原因很简单,参数化的泛型是一些实例。静态成员是被类的实例和参数化的类所共享的。所以静态成员不应该有类型参数和它相关联。
(13)Java程序设计的基本原则
a.面向接口编程
b.优先使用对象组合而非类继承
c.分层 最典型的三层架构:表现层->逻辑层->数据层
表现层:展示数据、人机交互、收集参数调用逻辑层
逻辑层:进行数据与逻辑校验、进行逻辑判断、实现业务功能、处理相关功能、处理后续流程、组织数据返回给表现层
数据层:实现数据持久化、实现对象和持久化数据的双向映射
一定是表现层调用逻辑层,逻辑层调用数据层、不可以反过来。
层间交互也应该通过接口进行调用,以确保各层实现独立变化。
(14)类设计的基本经验
a.类要单一
b.加强内聚,松散耦合
c.好的封装性
d.类的粒度要合理(类一般不超过5000行,方法不超过100行)
e.实现类不能依赖它的使用类
f.应考虑灵活性,也就是可配置(可以通过修改配置文件来选择系统实现的功能)、可维护(设计指标,系统可以很方便地修改已有的功能)
g.要考虑性能,考虑可伸缩性
h.要考虑今后可能的变化,也就是可扩展性
i.要考虑合理的复用
j.要合理地考虑接口和抽象类的使用 优先使用接口,既要约束子类的行为又要为子类提供公共的功能时优先使用抽象类
k.尽量减少类与协作类的交互次数和交互信息的量
l.父类不应该子类的信息,子类必须知道父类的信息
m.访问对象必须通过接口,不能绕过接口直接去实现