14-EXPLAIN关键词 1. EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 通过explain我们可以获得以下信息: 表的读取顺序 数据读取操作的操作类型 哪些索引可以使用 哪些索引被实际使用 表之间的引用 每张表有多少行被优化器查询 使用方法:EXPLAIN SQL语句; 2. 执行计划各字 2020-09-23 05_数据库 > 01_MySQL #MySQL #explain
03-类和接口(15-25) 15. 使类和成员的可访问性最小化尽可能使每个类或成员不被外界访问。 公有类的实例域决不能是公有的。 包含公有可变域的类通常并不是线程安全的。 让类具有公有的静态 final 数组域,或者返回这种域的访问方法,这是错误的。 16. 要在公有类而非公有域中使用访问方法如果类可以在它所在的包之外进行访问,就提供访问方法。 如果类是包级私有的,或是私有的嵌套类,直接暴露它的数据域并没有本质的错误。 17 2020-09-16 02_编程语言 > 01_Java > 04_EffectiveJava #EffectiveJava #接口
02-对所有对象都通用的方法(10-14) 10. 覆盖equals时遵守通用约定 使用 == 操作符检查 参数是否为这个对象的引用 使用 instanceof 操作符检查 参数是否为正确的类型 把参数转换成正确的类型 对于该类中的每个关键域,检查参数中的域是否与该对象中对应域相匹配 11. 覆盖 equals 时总要覆盖 hashCode因为没有覆盖 hashCode 而违反的关键约定:相等的对象必须具有相等的散列码 2020-09-16 02_编程语言 > 01_Java > 04_EffectiveJava #EffectiveJava #对象
04-泛型(26-33) 26. 不要使用原生态类型如果使用像 List 这样的原生态类型,就会失掉类型安全性,但是如果使用像 List<Object> 这样的参数化类型,则不会。 List 原生态类型 和 List<Object> 参数化类型的区别: 前者逃避了泛型检查 后者明确告知编译器,它能够持有任意类型的对象 不能将任何元素(除了 null 之外)放到 Collection< 2020-09-16 02_编程语言 > 01_Java > 04_EffectiveJava #EffectiveJava #泛型
05-枚举和注解(34-41) 34. 用 enum 代替 int 常量int 常量表示枚举类型: enum 类型表示枚举类型: 35. 用实例域代替序数永远不要根据枚举的序数导出与它关联的值,而是要将它保存在一个实例域中。 36. 用 EnumSet 代替位域枚举代替位域: 将 EnumSet 实例传递给 applyStyles 方法: 37. 用 EnumMap 代替序数索引java.util.EnumMap 3 2020-09-16 02_编程语言 > 01_Java > 04_EffectiveJava #注解 #EffectiveJava #枚举
06-Lambda和Stream(42-48) 42. Lambda 优先于匿名类 尽可能不要序列化一个 Lambda或匿名类实例。 千万不要给函数对象使用匿名类,除非必须创建非函数接口的类型的实例。 43. 方法引用优先于 LambdaJava提供了生成比 Lambda 更简介函数对象的方法:方法引用。 格式:类名::方法名 eg: 只要方法引用更加简介、更加清晰,就使用方法引用;反之则使用 Lambda。 44. 坚持使用标准的函数接口 2020-09-16 02_编程语言 > 01_Java > 04_EffectiveJava #Stream #Lambda #EffectiveJava
07-方法(49-56) 49. 检查参数有效性Java7 加入的 Objects.requireNonNull() 方法比较灵活且方便,因此不必再手工进行 null 检查。 50. 必要时进行保护性拷贝简而言之,如果一个类包含有从客户端得到或者返回到客户端的可变组件,这个类就必须保护性地拷贝这些组件。如果拷贝的成本受到限制,并且类信任它的客户端不会不恰当地修改组件,就可以在文档中指明客户端的职责是不得修改受到影响的组件 2020-09-16 02_编程语言 > 01_Java > 04_EffectiveJava #EffectiveJava #方法
08-通用编程(57-68) 57.将局部变量的作用域最小化要使局部变量的作用域最小化,最有力的方法就是在第一次要使用它的地方进行声明。 几乎每一个局部变量的声明都应该包含一个初始化表达式。 最后一种“将局部变量的作用域最小化”的方法是使方法小而集中。 58. for-each 循环优先于传统的 for 循环推荐增强 for 循环,或者 迭代器: 59. 使用类库从Java 7开始,就不应该再使用Random了。现在选择随 2020-09-16 02_编程语言 > 01_Java > 04_EffectiveJava #EffectiveJava #反射
10-并发(78-84) 78. 同步访问共享的可变数据synchronized 可以保证同一时刻,只有一个线程可以执行某一个方法或者代码块。 更灵活的用法可以使用 Lock 接口的实现类 ReentrantLock。 79. 避免过度同步通常,在同步的区域内做尽可能少的工作。 80. executor、task 和 stream 优先于线程如题。 81. 并发工具优先于 wait 和 notify比如 使用 Concur 2020-09-16 02_编程语言 > 01_Java > 04_EffectiveJava #EffectiveJava #并发
09-异常(69-77) 69. 只针对异常的情况才使用异常如题。 70. 对可恢复的情况使用受检异常,对编程错误使用运行时异常如题。 71. 避免不必要的使用受检异常如题。 72. 优先使用标准异常最常见的可重用异常: 73. 抛出与抽象对应的异常更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常。这种做法称为异常转译(exception translation)。 74. 每个方法抛出的所有异常 2020-09-16 02_编程语言 > 01_Java > 04_EffectiveJava #异常 #EffectiveJava