zoukankan      html  css  js  c++  java
  • Effective java 中文版本阅读总结

    花了半天时间,贪婪的啃读了Effective java 这本书(虽然闻名已久,但是很少看书)
    翻着翻着就有种废寝忘食的感觉,下班了都留下来专门看书,后来索性带回家看了.
    以下是内容总结,主要是对个人感觉有用的,有很大部分没有提及,因为水平有限,还没有来得及消化
    1 引言
     
    2 创建和销毁对象
    # 静态工厂方法优于构造器
    Boolean.valueOf(String); 几乎总是优于构造器Boolean(String);构造器每次调用的时候都会创建一个新的对象
    * 对象创建比较昂贵的类
    Calendar (推荐在静态代码块中实例化一次)
    建立数据库连接的代价非常昂贵,(重用对象非常有意义,数据库连接池--但是会增加内存占用,还会损坏性能,又要考虑jvm回收)
     
    * 静态工厂方法常用名称
    valueOf ()
    of()
    getInstance() Singleton,该方法没有参数,返回唯一实例
    newInstance() 确保每个返回的实例与其他实例都不同
    getType() 工厂方法所返回对象的类型
    newType() 工厂方法所返回对象的类型
     
    # 延迟初始化
    延迟到对象方法第一次调用才实例化,(有时候不建议这么做,会使得方法实现更加复杂,无法将性能显著提高)
     
    # String s=new String("hello"); //don't do this !
    该语句每次执行都会创建一个新的String实例,没必要! "hello"本身就是一个String实例
    如果这种用法是在循环中,或者是在一个被频繁调用的方法中,就会创建成千上万不必要的String 实例
    改进后的代码:
    String s="hello"; 对象可以被重用
     
    # 过期的对象引用--导致内存泄露
    如果一个栈先是增长,然后再收缩,那么从栈中弹出来的对象将不会被当做垃圾回收,即使栈的程序不再引用这些对象,它们也不会被回收
    这是因为栈内部维护着这些对象的过期引用(obsolete reference) ;所谓的过期引用是指,永远也不会再被解除的引用
     
    3 对于所有对象都通用的方法
    # 始终覆盖toString()方法 (通用约定: 应该是简洁已读的表现形式)
    java.lang.Object 提供了toString的一个实现,但他返回的字符串并不是类的用户所希望看到的;
    它包含"类的名称@散列码16进制表示法" 没有字符串"1353413xxxx" 来的简洁易懂
    建议所有子类覆盖这个方法
     
    4 类和接口
     
    5 泛型
    优先考虑泛型
    列表优先于数组
    利用有限制通配符,提升api灵活性
     
    6 枚举和注解
    注解优先于命名模式
     
    7 方法
    * 使用断言,检查参数有效性(本质上也不会有开销)
    * 谨慎设计方法签名 (名称,过长参数列表)
    * 谨慎使用可变参数
    static int sum(int firstArg,int ...args){
    int min=firstArg;
    for(int arg:args){
    }
    }
    * 返回0长度的数组或者集合,而不是null
    客户端程序员可能会忘记处理null
    对于避免开销问题,对于这种程度的性能问题担忧是不明智的,除非分析表明这个代码正是导致性能问题的来源;
    return new Array[0];
    * 为所有导出的api元素编写文档
     
    8 通用程序设计
    * 局部变量作用域最小化
    较早程序设计语言(如c语言),要求局部变量声明在代码块的开头;这个习惯要改正
    要使局部变量作用域最小化,应该是第一次使用的地方声明;(避免分散程序员注意力,等使用该变量时已经不记得变量类型和初始值了)
     
    * for-each 循环优先于传递for循环
    * 了解和使用内裤(类库)
    具有算法背景的高级工程师花了大量时间设计,实现和测试,然后通过领域专家审核,确保正确
    把时间花在应用程序上,而不是底层细节上;
    很多人使用,被当做工业标准,促使优化,提高性能,无需做任何努力;
    不要重新发明轮子,如果你做的事情十分常见,可能类库中已经提供实现
    每个程序员都需要熟悉:
    java.lang
    java.util
    java.io
     
    * 需要精确答案,避免使用float和double
    主要是为科学计算和工程计算设计,并没有提供完全精确的结果
     
    * 基本类型优于集装箱类型
    * 字符串连接性能
    使用stringBuilder 提升50倍+ 以上
    * 通过接口引用对象
    规则1: 不要进行优化,
    规则2: 还是不要进行优化
    在没有绝对清晰的优化方案前,请不要进行优化
     
    * 遵守普遍接受命名规则
    * 尽量减少反射的使用
    丧失了编译时检查类型的好处;
    执行反射的代码非常冗长和笨拙;
    性能损失,反射比普通方法调用慢了许多,差异难说 2-50倍...
    RPC 远程调用时使用是比较合适的
     
     
    9 异常
    不太理解...
     
    10 并发
    * 避免过度同步(性能降低,死锁)
    * executor和task优先于线程
     
    11 序列化
    不太理解...
     
    个人倾向于用百度脑图整理知识点,使用有道云笔记编写总结文档,所以博客上会有比较多的链接,阅读体验可能不太好. 脑图阅读建议: 1 根据序号阅读 2 有链接的地方是可以直接跳转链接的 (),比如下载 ; 外链基本都是官方文档,本人也是比较推荐看官方文档的,这样学习才能有整体性 3 有 详细说明()的地方是需要鼠标浮动显示的 4 有 有道云笔记总结的是对应知识点的总结,适合实践参考阅读
  • 相关阅读:
    tensorflow2.0 GPU和CPU 时间对比
    第一次使用FileZilla Server
    PremiumSoft Navicat 15 for Oracle中文破解版安装教程
    Unmapped Spring configuration files found. Please configure Spring facet or use 'Create Default Context' to add one including all unmapped files.
    ng : 无法加载文件 D: odejs ode_global g.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
    angular
    Github上优秀的go项目
    win10---file explore 中remove quick access folder
    react--useEffect使用
    linux---cat 和 grep 的妙用
  • 原文地址:https://www.cnblogs.com/javastar/p/7062127.html
Copyright © 2011-2022 走看看