1/51
本套闪卡基于《阿里巴巴Java开发手册》节选内容,覆盖类型与包装、BigDecimal、日期时间、集合、并发、控制语句、日志、安全等关键强制/推荐规范,帮助考生快速回顾核心规则。
Name | Mastery | Learn | Test | Matching | Spaced |
---|
No study sessions yet.
为什么任何货币金额都必须用最小货币单位且整型来存储?
避免浮点数表示不精确导致的金额误差。
浮点数如何进行等值比较?
指定误差范围比较差值,或使用 BigDecimal 再比较。
BigDecimal 等值比较应使用哪个方法?为什么?
compareTo(),因为 equals() 同时比较值和精度。
禁止使用 BigDecimal(double) 构造方法的原因是什么?
会因二进制无法精确表示十进制而造成精度损失。
POJO 类属性为何必须使用包装类型?
便于表示 null,如远程调用失败时返回 null,避免默认值误导。
为什么定义 DO 类时属性类型要与数据库字段类型匹配?
防止数值溢出或精度丢失,例如 bigint 对应 Long。
新增序列化类属性时可否修改 serialVersionUID?
不要修改,除非完全不兼容,需要避免反序列化失败时才修改。
为什么构造方法中禁止加入业务逻辑?
构造只做对象创建,业务逻辑放 init,避免难以测试与维护。
POJO 类必须实现哪个常用方法以便排查问题?
toString()
在 POJO 中同时存在 isXxx() 和 getXxx() 有什么风险?
框架无法确定调用顺序,导致数据不一致。
使用 String.split 后为何要检查最后一个分隔符?
split 可能忽略尾部空串,导致数组长度比预期小,出现越界。
循环体内连接字符串应使用什么?
StringBuilder.append(),避免频繁创建临时对象。
使用 final 的五种典型场景是什么?
1) 不可继承类;2) 不可修改引用;3) 不可覆写方法;4) 不可重新赋值局部变量;5) 防止变量被重复使用。
为什么慎用 Object.clone()?
默认是浅拷贝,若需深拷贝需自行实现,容易出错。
访问控制从严的八条规则中,静态成员变量仅本类使用应设为?
private(并考虑是否 final)。
日期格式化时年份必须使用小写 y,原因?
大写 YYYY 表示周所在的年份,可能跨年导致结果错误。
SimpleDateFormat 为什么不能定义为 static?
线程不安全;如果必须 static,需要加锁或用 ThreadLocal。
获取当前时间毫秒数推荐使用什么方法?
System.currentTimeMillis()
Java 中禁止使用 java.sql.Date/Time/Timestamp 的原因?
功能缺陷或已知 BUG,易导致时间比较异常。
判断集合是否为空应使用哪个方法?
isEmpty() 而非 size()==0。
使用 Collectors.toMap 时必须提供 mergeFunction 的原因?
处理重复 key,否则抛 IllegalStateException。
Collectors.toMap value 可能为 null 时会怎样?
触发 HashMap.merge 内部检查抛 NullPointerException。
ArrayList.subList 返回对象能否强转为 ArrayList?
不能,返回的是内部类 SubList,会抛 ClassCastException。
Map 的 keySet()/values()/entrySet() 返回集合可否添加元素?
不可,否则抛 UnsupportedOperationException。
使用集合转数组时正确的调用方式是什么?
toArray(new T[0]),传入长度为0的同类型数组。
为什么 foreach 中不能直接 remove 元素?
会触发 ConcurrentModificationException,应使用 Iterator.remove()。
自定义 Comparator 必须满足哪三个条件?
1) 自反;2) 传递;3) 与等号一致,否则排序可能异常。
创建线程或线程池时为什么要命名线程?
便于出错时通过线程名快速定位问题。
为什么不推荐 Executors 创建线程池?
可能隐含无界队列或线程数无限,导致 OOM,应使用 ThreadPoolExecutor。
ThreadLocal 使用后为何必须 remove?
线程池复用线程,未清理会造成内存泄露及业务干扰。
多资源加锁时为何要求统一加锁顺序?
避免死锁。
使用 Lock.lock() 应如何编写 try/finally 结构?
lock(); try{…} finally {unlock();},加锁语句必须在 try 外。
为什么并发场景下推荐使用双重检查锁且变量声明 volatile?
解决指令重排造成的延迟初始化安全问题。
switch 块内为什么必须包含 default 并放最后?
保证任何情况都有处理,易读且避免遗漏。
三目运算符可能因自动拆箱引发什么异常?
NullPointerException。
高并发场景中不应使用“等于”作为终止条件的原因?
并发处理可能击穿条件,导致无法终止,应使用区间判断。
方法内部多层 if-else 应如何优化?
使用卫语句、策略模式、状态模式等,避免超过3层嵌套。
为何禁止在 finally 中 return?
会覆盖 try 块中的返回值,逻辑难以理解,引发错误。
日志输出为何应使用占位符而非字符串拼接?
减少 StringBuilder 创建,提高性能,并在未开启日志级别时避免拼接开销。
生产环境禁止使用 e.printStackTrace() 的原因?
输出到标准错误文件,滚动不及时且难以统一管理。
单元测试应满足 AIR 原则各指什么?
Automatic 自动化、Independent 独立性、Repeatable 可重复。
单测文件应该放在哪个目录?
src/test/java
安全规约中对 SQL 输入应采取什么措施?
使用预编译/参数绑定,不得拼接 SQL。
什么是 CSRF,表单提交必须做什么验证?
跨站请求伪造,必须校验 CSRF token。
为何用户敏感数据展示必须脱敏?
防止隐私泄露,如手机号中间四位用 **** 替代。
错误码 5 位的组成及三大来源字母分别代表什么?
来源字母(A用户/B系统/C第三方)+4位编号。
遇到 RuntimeException 能预检查的场景应如何处理?
通过前置条件判断避免异常,而非 catch。
自定义异常相比直接抛 RuntimeException 的优势?
表达具体业务语义,便于定位和处理。
为什么 catch 后必须处理或继续抛出异常?
捕获后忽略会掩盖问题,最外层需要转化为用户可理解的信息。
finally 块关闭资源时应注意什么?
即使 close() 抛异常也要 try-catch,JDK7 可用 try-with-resources。
日志至少保留多久?生产环境日志保存路径示例?
至少15天;示例:/home/admin/app/logs/app.log。
在日志级别 trace/debug/info 输出前应做什么判断?
使用 logger.isDebugEnabled() 等开关判断,避免无谓计算。