一、java基础语句规范
1.1 switch得default语句
必须带有default语句,除非是枚举类型。
1.2 switch的break语句
分支必须包含break语句,否则不满足条件会发生全部输出语句,不会结束。
1.3 建议 if-else-if类型条件判断
建议,最后加一个else分支。 用来解决不符合规则的输入。类似default语句。
1.4 不能用浮点类型作为循环变量
精度问题会产生意想不到的问题 浮点数由三部分组成:符号位S,指数部分E,尾数部分M float: S----E----M 1位 8位 23位 供32位
double: S----E----M 1 11 52
尾数部分为有效数字。
1.5 明确的进行类型转换
不要依赖隐士类型转换【系统自动完成,存储范围晓得类型自动向打的类型进行的转换】 强制类型转换:存储大的-->小的 进度损失 精确计算?BigDecimal来进行计算
二、类的使用规范
2.1 类名调用静态方法
不要使用实例化的方式进行调用方法 注意:使用实例化来调用静态方法时候,调用的静态方法是声明类型的静态方法,与实例实际类型无关。 当父类与子类有同名的静态方法时候,声明父类变量引用子类实例,调用静态方法时候调用的就是父类的静态方法。 父类子类有同名非静态:重写 父类和子类有同名静太:隐藏,调用的是父类的方法 使用类名来调用!!!
2.2 避免隐藏,遮蔽和遮掩
正确: 复写-->存在于子类父类之间 重载-->存在于类的内部【一组相似的行为用相同的命名】 隐藏-->子类与父类之间相同成员名,相同的方法名 遮蔽-->发生子啊类内部:一个变量方法或者类分别遮蔽在类内部具有相同名字的变量方法或者类,无法简单名引用到。 遮掩-->一个变量可以遮掩具有相同名字的一个类,只要他们都在同一个范围内:唯一一种两个名字位于不同名字空间的名字重用形式。 包括变量,包,方法或者类型。
2.3 子类复写父类方法要加Override注解
编译期发现是否已经复写父类方法
2.4 哈希集合存储对象的相关规则
HashSet是Set接口的实现,不允许重复【当有对象存储于这个类型之中,不允许修改hascode,否则内存泄漏等问题】 元素不重复是基于HashMap实现的 非线程安全 对于HashSet和HashMap,对象的hashcode至关重要,在hashcode集合内找到该对象完全依赖此值。 如果一个对象存入hash集合后,修改了参与计算的hashcode有关的字段,那么修改后的hashcode值就与最初存储进来的hashcode不同了 结果就是在集合内部找不到该对象,进而不能删除对象,造成内存泄漏。
2.5 向下转型前使用instanceof判断
自动类型转换:向上类型转换,小类型--->大类型的转换 强制类型转换:向下类型转换,大类型--->小类型的转换 老虎-->动物 没问题 动物-->老虎 有风险 需要判断instanceof
2.6 使用集合的toArray()方法转成数组
2.7 使用System.arraycopy()进行数组复制
如:for循环 复制到新数组 简单实现:System.arraycopy(),从制定位置开始,到目标函数指定位置结束 函数原型: public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
src:源数组 srcpos:源数组的指定开始位置 dest:目标数组 desPos:目标数组起始位置 length:长度
native:是原生方法,由C、C++实现
优势:数组大小 小数组:for循环适合几百大小 大数组:arraycopy适合成千上万
三、异常处理规范
3.1 在异常条件下,保证释放已有的锁
ReentrantLock 可重入锁 互斥锁 ReentrantLock是一种递归同步机制=====等同于synchronized使用 但是ReentrantLock提供了比synchronized更强大的,灵活的锁机制,可以减少死锁的发生
ReentrantLock类能够实现线程之间的同步互斥 ReentrantLock完全互斥排他的效果,同一时间只有一个线程在执行 ReentrantLock.lock()方法后面的任务 释放锁放到finally语句块中。 这样就会解决没有异常的线程正常执行!
3.2 防止通过异常泄露敏感信息
信息泄露,如FileNotFoundException 就会发现异常,从而推测系统挖掘结构。 会打印文件的路径!!!!!黑客得知。 比进行过滤。 解决:放大IOException,catch异常进行处理!
3.3 拒绝在finally块中非正常结束
异常处理机制,最佳补充。 不要使用return,break,continue使其非正常结束! 否则会导致无法抛出异常。
四、认证考试试题
/** * @author 纸浅 * @date 2020/5/29 9:34 */ public class TestC { public static void main(String[] args) { List<String> nameList2 = new ArrayList<>(); nameList2.add("jim"); nameList2.add("jim"); String[] array2 = (String[]) nameList2.toArray(); for (int i = 0; i < array2.length; i++) { System.out.println("array->"+array2[i]); } } } 编译通过,执行异常 ------------------------------------------------------ /** * @author 纸浅 * @date 2020/5/29 9:34 */ public class TestC { public static void main(String[] args) { char data = '5'; int test = 4; switch (data + 1){ case '5': test = test+1; case '6': test = test+3; case '7': test = test+5; break; default: test = test+7; } System.out.println(test); } } 12 ---------------------------------------------- 设置 线程名字 /** * @author 纸浅 * @date 2020/5/29 14:36 */ public class ThreadName extends Thread { public ThreadName(String threadName){ super(threadName); } @Override public void run(){ while (true){ System.out.println("running"); } } public static void main(String[] args) { ThreadName threadName = new ThreadName("testName"); threadName.start(); } } ---------------------------------------- /** * @author 纸浅 * @date 2020/5/29 14:36 */ public class ThreadName extends Thread { public void start(){ for (int i = 0; i < 10; i++) { System.out.println(i); } } public static void main(String[] args) { ThreadName threadName = new ThreadName(); threadName.start(); } } 编译通过 -------------------------------------------- /** * @author 纸浅 * @date 2020/5/29 9:34 */ public class TestC { public static void main(String[] args) { //int a = 3; int a = 1; switch (a){ default: System.out.println(5); break; case 0: System.out.println(0); case 1: System.out.println(1); case 2: System.out.println(2); break; } } } 5 1 2 --------------------------------------------- /** * @author 纸浅 * @date 2020/5/29 9:34 */ public class TestC extends Thread{ public static void main(String[] args) { switch (3){ default: System.out.println(3); case 0: System.out.println(0); break; case 1: System.out.println(1); case 2: System.out.println(2); break; } } } 3 0 ------------------------------------------