注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

改善java程序的建议  

2013-03-12 18:23:16|  分类: reading |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      《编写高质量代码 改善java程序的151个建议》
      变长参数,调用不清晰时,java编译器先尝试原始类型。
      count = 0; count = count++; 结果是count值为0,count自增操作后,会将其自增前的值返回。c++中的结果不一样,而php跟java的处理方式一样。
      java编译器最短路径原则,本类中的方法和变量,会覆盖静态导入的方法和变量。
      java6开始直接运行脚本语言,支持动态编译。

      java反序列化时构造方法不会执行,因此,若序列化类中final变量在构造方法中才被初始化的话,jvm就不会初始化这个final变量。
      简单对象(8个基本类型、数组、String)反序列化时final变量不会被重新赋值。分几种情况:构造方法中为final变量赋值、通过方法返回值为final变量赋值、final修饰的属性不是基本类型。
      代码块的内容会插在每个构造方法的最开头,如果遇到this关键字则不插入代码块。super关键字不会作此处理,代码块直接插入super之后。
      普通类的构造方法默认调用父类的无参构造方法?匿名类的构造方法调用父类的同参构造方法。
      StringBuilder一般用来进行sql语句拼接、json封装等。
      让类不可实例化,除构造方法私有,并需在其中抛出Error(对应反射方法获得类实例的方式)。
      对象拷贝比new一个对象快得多,因为是在内存中进行的。
      apache commons SerializationUtils 。
      Collator类对字符排序。
      重写toString()属性比较多时,使用apache commons 的ToStringBuilder。
      package-info类,无法直接创建这个类,用文本编辑器新建文件,并拷贝到项目中。
      Arrays.copyOf,构造变成数组。System.arraycopy要求你必须提供一个目标数组,而Arrays.copyOf不用你提提供目标数组。copyOf的源码:
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {  
    T[] copy = ((Object)newType == (Object)Object[].class)  
        ? (T[]) new Object[newLength]  
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);  
    System.arraycopy(original, 0, copy, 0,  
                     Math.min(original.length, newLength));  
    return copy;  
      TreeSet ts , ts.lower(ts.last());set中第二大的元素。
      Array.asList()的参数要使用基本类型的包装类型,asList()产生的对象不可更改。
      ArrayList实现了RandomAccess接口,元素之间没有相互依赖和索引关系,可随机访问。而foreach的遍历是基于iterator的,若对ArrayList使用foreach会强制建立关联关系,因此会影响性能。而LinkedList实现了双向列表,本身各元素之间已有关联关系,使用foreach遍历比使用下标遍历更快。System.arraycopy()是本地方法效率很高。ArrayList使用System.arraycopy(),但频繁使用(增加)时效率仍不及LinkedList。LinkedList插入、删除效率高,ArrayList修改效率高,实时系统推荐使用LinkedList。
      删除指定范围的子列表:list.subList(20, 30).clear();
      Collections.unmodifialbleList(list); CompareToBuilder()
      binarySearch()比indexOf()性能高,但要先排序。
      集合类操作,并集 addAll();交集 list1.retailAll(list2);差集 removeAll();无重复并集 list2.retailAll(list1); list1.addAll(list2);
       Collections.swap(list, i, j); 交换元素, Collections.shuffle(list);打乱list的顺序。
      Enum的默认方法.values()返回所有枚举值;ordinal获得排序值;compareTo...。枚举不能继承。switch之后的枚举变量是根据枚举的排序值进行匹配的。
switch(season){
    case Spring:
        ...
        break;
    case Summer:
        ...
}
相当于
switch(season.ordinal()){
    case Season.Spring.ordinal():
        ...
        break;
    case Season.Summer.ordinal():
        ...
}
因此switch中的枚举传入null会出错。
      switch default throw AssertionError.Java-Compile-Errors/Warnings,Eclipse在这里有“Enum type constant not covered on 'switch'”,设置为Errors级别,如果不判断所有的枚举项就不能通过编译。
      枚举的valueOf()方法需校验,否则在找不到项目时会有IllegalArgumentException。
      使用枚举来实现工厂方法模式。......
      EnumSet allOf() --> noneOf()。当枚举项数目小于64时,用64位的一个long变量记录所有的枚举项。当枚举项数目<=64,使用RegularEnumSet实现,>64时使用JumboEnumSet。RegularEnumSet 把枚举项的ordinal映射到一个long类型的每个位上。因此在枚举项<=64个的时性能很高。
      @Inherited注解,声明注解可继承。被注解类的子类不能很清楚地根据当前类的代码了解自己被标注了哪些注解,代码可读性差。
      List<Integer> list = ArrayUtils.<Integer>asList();
      List<Number> list = ArrayUtils.<Number>asList();//java泛型在编译期有效,编译后会被擦除。
      ArrayLis.class.equals(new ArrayList<String>().getClass());
      泛型结构只参与读操作则限定上界(extends),只参与写操作则限定下界(super),即用作读又用作写则不限定,如List<E>。
      <T extends Stuff & Passenger>泛型类型多重界限。
      getDeclaredXXX,getXXX:getMethod是获得所有public级别的方法,包括父类的方法。getDeclaredMethod获得自身的所有方法,不受限于访问权限。需列出所有继承自父类的方法,需先获取父类,然后使用getDeclaredMethod递归之。
      反射invoke方法前,先检查Accessible。if (!m.isAccessible()) {m.setAccessible(true); ...}
      Class.forName()与静态代码块。Class.forName(),如果这个类尚未初始化,会导致这个类的静态代码块的执行。
      动态加载类不适合数组。
      一个方法内抛出多个异常。封装自定义异常,先捕获所有异常(暂不抛出),用集合类缓存起来。最后抛出封装了所有异常的自定义异常。getCause Exception的异常信息。
      return语句在 finally中, System.exit(0)、Runtime.getRuntime.exit(0)在异常代码块中,会产生很多错误假像。
      在出现异常或主动声明一个Throwble对象时,JVM会通过fillInStackTrace方法记录下栈帧信息,然后生成一个Throwble对象。这样我们就可以知道类间的调用顺序、方法名称及当前行号了。
      Math.hypot(Math.pow(924526789, i), Math.cos(i)); //费cpu而无意义的语句,用于测试
      ThreadPoolExecutor shutdown
      Thread setUncaughtExceptionHandler 可以在线程出现异常时进行重启操作。不过线程重启不能解决所有问题,在这些情况下,一般线程重启是不能解决的:共享资源锁定、脏数据导致逻辑混乱、内存溢出。
      lock.tryLock() //自旋锁
      BlockingQueue  ArrayBlockingQueue  CountDownLatch  CyclicBarrier

      Guava, apache commons, Joda, fastutil, Trove, lambdaj

40,80.91,105
  评论这张
 
阅读(612)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017