1. 什么是好的代码?
高效正确
便于维护
简洁清晰
2. 如何做?
让代码比你来时更干净
做有意义的命名
别重复自己
注意代码工整
记住:不要把自己当程序员,要把自己当成艺术家,出自你手的代码都是一件艺术品,尽量让她优雅。
3.原则
第一条,关于注释和文档
好的代码不需要注释和文档(不包括设计文档)。
我们要做的,尽量让你的代码简单易懂,如果实在做不到,一定添加简单易懂的注释文字。不要繁琐的长篇大论。
记住:代码里一切注释和文档都是浮云。
第二条,关于代码结构
不要为了实现需求不停的堆代码,讲究下技巧
多用面向对象和面向接口编程,以提高代码的扩展性和可维护性
多用用设计模式,以提高代码的可阅读性和灵活性,避免重复你的代码
记住:简单,优雅,清晰的代码是最能减轻工作量和减少出现问题的方法。
第三条,关于测试
如果可能,尽量让你所有的方法都有测试代码
如果可能,应用测试驱动开发
如果可能,尽量在发布程序的之前运行测试用例并保证没有问题
记住:没有测试的代码都是浮云
4. Tips
1.避免重复初始化。
test1
HashMap map = new HashMap();
public Test1(){
// map = new HashMap();
}
public static void main(String[] args) {
int TT = 1000000;
long t1 = System.currentTimeMillis();
for(int i=TT; i>=0; --i) {
Test1 t = new Test1();
}
System.out.println(System.currentTimeMillis()-t1);
}
重复初始化时间:187 172
正常初始化时间: 94 93
test2
public final static int max(int a, int b) {
return (a>b)? a:b;
}
public static void main(String[] args) {
final int TT = 1000000;
int a = 5, b=10;
int c;
long t1 = System.currentTimeMillis();
for(int i=TT; i>=0; --i) {
c = max(a, b);
}
System.out.println(System.currentTimeMillis()-t1);
long t2 = System.currentTimeMillis();
for(int i=TT; i>=0; --i) {
c = (a>b)? a:b;
}
System.out.println(System.currentTimeMillis()-t2);
}
final 方法会使用内联方式进行编译,这样会提高性能,不过貌似新的JVM做了优化,第一次运行时会慢一些,以后非final和final性能差不多。
test3
NewObject object=new NewObject();
int value;
if(i>0) {
value=object.getValue();
}
优化后:
int value;
if(i>0){
NewObject object = new NewObject();
Value = object.getValue();
}
就近原则,尽量采用Lazy loading策略,减少内存开销
test4
List?alist=uSvr.getUserinfoList();
for(int i=0;i<alist.size();i++){
。。。
}
优化后:
for(int i=0,p=alist.size();i<p;i++){
。。。
}
循环操作时,尽量使用局部变量,减少内存寻址时间
15 16
0 0
test5
long t1 = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
Test1 t = new Test1();
}
System.out.println(System.currentTimeMillis() - t1);
long t2 = System.currentTimeMillis();
Test1 t = null;
for (int i = 0; i < 10000000; i++) {
t = new Test1();
}
System.out.println(System.currentTimeMillis() - t2);
减少循环New变量的操作,这种做法会在内存中保存N份这个对象的引用,会浪费大量的内存空间,增加GC
64 63
47 47
test6
避免在做最终条件比较时采用方法返回值的方式进行判断,这样做将增大系统开销,降低性能
while(isTrue()) {
...
}
优化后:
boolean isTrue= isTrue();
while(isTrue) {
...
}
test7
尽量避免在循环体中使用try-catch块,最好在循环体外进行try-cache以提高性能
do{
try{
...
} catch(Exception e){ }
}while(isTrue)
优化后
try{
do {
...
}while(isTrue)
}catch(Exception e){}
test8
在多重循环中,如果有可能,尽量将最他的循环放在最内层,最短循环放在最外层,以减少循环切换次数。
for (int i=0; i<100000; i++) {
for(int j=0; j<10; j++) {
...
}
}
优化后:
for (int j=0; j<10; j++) {
for(int i=0; i<100000; i++) {
...
}
}
test9
循环内有If-else类逻辑,最好将if-else逻辑判断移到循环体外,以提高性能。
for(int i=0; i<100000; i++)
if(isTrue){
doThis
} else {
doThat
}
}
优化后:
if(isTrue) {
for(int i=0; i<100000;i++) {
doThis
}
} else {
for(int i=0; i<100000;i++) {
doThat
}
}
高效正确
便于维护
简洁清晰
2. 如何做?
让代码比你来时更干净
做有意义的命名
别重复自己
注意代码工整
记住:不要把自己当程序员,要把自己当成艺术家,出自你手的代码都是一件艺术品,尽量让她优雅。
3.原则
第一条,关于注释和文档
好的代码不需要注释和文档(不包括设计文档)。
我们要做的,尽量让你的代码简单易懂,如果实在做不到,一定添加简单易懂的注释文字。不要繁琐的长篇大论。
记住:代码里一切注释和文档都是浮云。
第二条,关于代码结构
不要为了实现需求不停的堆代码,讲究下技巧
多用面向对象和面向接口编程,以提高代码的扩展性和可维护性
多用用设计模式,以提高代码的可阅读性和灵活性,避免重复你的代码
记住:简单,优雅,清晰的代码是最能减轻工作量和减少出现问题的方法。
第三条,关于测试
如果可能,尽量让你所有的方法都有测试代码
如果可能,应用测试驱动开发
如果可能,尽量在发布程序的之前运行测试用例并保证没有问题
记住:没有测试的代码都是浮云
4. Tips
1.避免重复初始化。
test1
HashMap map = new HashMap();
public Test1(){
// map = new HashMap();
}
public static void main(String[] args) {
int TT = 1000000;
long t1 = System.currentTimeMillis();
for(int i=TT; i>=0; --i) {
Test1 t = new Test1();
}
System.out.println(System.currentTimeMillis()-t1);
}
重复初始化时间:187 172
正常初始化时间: 94 93
test2
public final static int max(int a, int b) {
return (a>b)? a:b;
}
public static void main(String[] args) {
final int TT = 1000000;
int a = 5, b=10;
int c;
long t1 = System.currentTimeMillis();
for(int i=TT; i>=0; --i) {
c = max(a, b);
}
System.out.println(System.currentTimeMillis()-t1);
long t2 = System.currentTimeMillis();
for(int i=TT; i>=0; --i) {
c = (a>b)? a:b;
}
System.out.println(System.currentTimeMillis()-t2);
}
final 方法会使用内联方式进行编译,这样会提高性能,不过貌似新的JVM做了优化,第一次运行时会慢一些,以后非final和final性能差不多。
test3
NewObject object=new NewObject();
int value;
if(i>0) {
value=object.getValue();
}
优化后:
int value;
if(i>0){
NewObject object = new NewObject();
Value = object.getValue();
}
就近原则,尽量采用Lazy loading策略,减少内存开销
test4
List?alist=uSvr.getUserinfoList();
for(int i=0;i<alist.size();i++){
。。。
}
优化后:
for(int i=0,p=alist.size();i<p;i++){
。。。
}
循环操作时,尽量使用局部变量,减少内存寻址时间
15 16
0 0
test5
long t1 = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
Test1 t = new Test1();
}
System.out.println(System.currentTimeMillis() - t1);
long t2 = System.currentTimeMillis();
Test1 t = null;
for (int i = 0; i < 10000000; i++) {
t = new Test1();
}
System.out.println(System.currentTimeMillis() - t2);
减少循环New变量的操作,这种做法会在内存中保存N份这个对象的引用,会浪费大量的内存空间,增加GC
64 63
47 47
test6
避免在做最终条件比较时采用方法返回值的方式进行判断,这样做将增大系统开销,降低性能
while(isTrue()) {
...
}
优化后:
boolean isTrue= isTrue();
while(isTrue) {
...
}
test7
尽量避免在循环体中使用try-catch块,最好在循环体外进行try-cache以提高性能
do{
try{
...
} catch(Exception e){ }
}while(isTrue)
优化后
try{
do {
...
}while(isTrue)
}catch(Exception e){}
test8
在多重循环中,如果有可能,尽量将最他的循环放在最内层,最短循环放在最外层,以减少循环切换次数。
for (int i=0; i<100000; i++) {
for(int j=0; j<10; j++) {
...
}
}
优化后:
for (int j=0; j<10; j++) {
for(int i=0; i<100000; i++) {
...
}
}
test9
循环内有If-else类逻辑,最好将if-else逻辑判断移到循环体外,以提高性能。
for(int i=0; i<100000; i++)
if(isTrue){
doThis
} else {
doThat
}
}
优化后:
if(isTrue) {
for(int i=0; i<100000;i++) {
doThis
}
} else {
for(int i=0; i<100000;i++) {
doThat
}
}