我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > Java编程中写出好代码的建议
总共48087条微博

动态微博

查看: 1935|回复: 0

Java编程中写出好代码的建议

[复制链接]

326

主题

72

听众

999

金钱

实习版主

该用户从未签到

优秀版主

跳转到指定楼层
楼主
发表于 2014-05-10 10:35:48 |只看该作者 |倒序浏览
最近在做应用的性能优化,在review代码的过程中积累了一些规则和经验。做到这些规则的目的很简单,就是写出“优美”的代码来。4 d' R5 v: C! N- j1 N- O9 o
3 e* c4 }  Y, N4 H
1、注释尽可能全面
6 ~; [, a( m8 b6 y6 s. t' B3 [# s; ^
  j/ V7 A4 c$ f% w: t, P* y对于方法的注释应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述;类的注释应该包含类的功能说明、作者和修改者。
  b+ k: x, B( @+ \' m% B- g$ a9 n$ ]1 M: {8 c& E
2、多次使用的相同变量最好归纳成常量! M5 v, Z  r4 D) k2 x$ i3 P
( u4 \2 j/ ?! T1 j4 Q* I$ ]% l% N
多处使用的相同值的变量应该尽量归纳为一个常量,方便日后的维护。
3 t/ x$ |( ^$ d$ J, c
& L  p+ P# d% i" r$ j) P" i3、尽量少的在循环中执行方法调用
0 C0 x( l! ~4 W7 N# B
' ^) j- B  f+ Z* S尽量在循环中少做一些可避免的方法调用,这样可以节省方法栈的创建。例如:
9 O' B9 w. [) \4 Z3 T
4 [8 H& h' f; H* Wfor(int i=0;i<list.size();i++){  4 V* G; n* J( s) C8 K* g* x9 J
  System.out.println(i);  
9 p: R6 c) c$ F& D% |}
" P/ v' @$ f2 R. ^" ?) ]可以修改为:
3 T1 I0 T& _, {) I7 r% t5 s
" R: S0 S3 O2 k4 Y5 \3 X; ofor(int i=0,size=list.size();i<size;i++){  $ u2 Q# K8 u7 ^, |0 k6 K1 O
  System.out.println(i);  3 S% _3 Y/ ^+ v/ P
}
( E' w, f: ~% e. S8 q. N1 R$ h4、常量的定义可以放到接口中
& l: A/ P  {1 g: E
& A; }$ O# W+ }1 k! ^java中,接口里只允许存在常量,因此把常量放到接口中声明就可以省去public static final这几个关键词。
7 e' d4 L% F- T! Q: K. z( ]
& Y9 \/ _7 c; e  W) |) {1 _5、ArrayList和LinkedList的选择- g" k' C- b- Q9 @$ h# ^

' A0 B, v0 P. w8 T7 y6 a9 U这个问题比较常见。通常程序员最好能够对list的使用场景做出评估,然后根据特性作出选择。ArrayList底层是使用数组实现的,因此随机读取数据会比LinkedList快很多,而LinkedList是使用链表实现的,新增和删除数据的速度比ArrayList快不少。
4 Q7 J2 a) K. k* J4 u- {0 f; X/ T7 {; q9 t7 h  u6 D( b: r
6、String,StringBuffer和StringBuilder% n. T% X9 |" {/ y( s( ]! z1 x
7 }& `" I1 F! E; w# M3 k
这个问题也比较常见。在进行字符串拼接处理的时候,String通常会产生多个对象,而且将多个值缓存到常量池中。例如:
/ B0 d$ @* q$ o
, O+ z  t8 @* C0 Q8 W1 F/ YString a="a";  
, `* a, x! v# XString b="b";  
0 J- d- d, C4 _# c- M% Wa=a+b;
" g* m4 l& Q. R! J2 Y) c这种情况下jvm会产生"a","b","ab"三个对象。而且字符串拼接的性能也很低。因此通常需要做字符串处理的时候尽量采用StringBuffer和StringBuilder来。
5 x1 n$ y% L  j" m. A* U  ^. k, C$ i" B& _" ^' N
7、包装类和基本类型的选择9 n! e7 r* ^8 m6 `) G: L

; H/ Q, f; I1 q8 n0 M) [2 F* d在代码中,如果可以使用基本数据类型来做局部变量类型的话尽量使用基本数据类型,因为基本类型的变量是存放在栈中的,包装类的变量是在堆中,栈的操作速度比堆快很多。7 `4 s0 A' O; h3 i/ |' P% |
' [) e, D5 M* _  c
8、尽早的将不再使用的变量引用赋给null
1 `  n6 k$ c, z
6 w/ Y. Y. D4 r4 j! Z. J0 L这样做可以帮助jvm更快的进行内存回收。当然很多人其实对这种做法并不感冒。
% K1 r9 {+ v3 i* D* R: C' T- U# ?; P
9、在finally块中对资源进行释放
  c. w7 X0 ?# C9 P8 D8 P
$ w1 n) J- d2 y3 R' m典型的场景是使用io流的时候,不论是否出现异常最后都应该在finally中对流进行关闭。& S0 r/ v) e9 N# z7 ~! p5 S% v

" N) s* m. `$ G# ~0 ~' \! @' a& v  N10、在HashMap中使用一个Object作为key时要注意如何区分Object是否相同
! {0 l# B1 V; ^% ~/ F1 j+ C% Z6 w' i* j0 G4 G. w
在jdk的HashMap实现中,判断两个Object类型的key是否相同的标准是hashcode是否相同和equals方法的返回值。如果业务上需要对两个数据相同的内存对象当作不同的key存储到hashmap中就要对hashcode和equals方法进行覆盖。
3 R8 t: @- i+ S$ s
) u: p% @3 ]  v* g

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表