Java程序员的八个最佳实践


betterprogramming文章提出了一些专家建议,这些建议将提高Java代码的效率。
 
1.小心使用字符串
如果在一个for循环中使用+运算符串联了两个字符串,则每次都会创建一个新的字符串对象。
这浪费了内存并增加了性能时间。另外,在实例化String对象时,应避免构造函数,而应直接进行实例化。这是一些代码:

//
较慢的实例化
String bad = new String("Hello World");

//更快的实例化

String good = "Hello World!";

 
2.避免不必要的对象创建
对象创建是Java中最昂贵的操作(就内存利用率而言)。因此,建议仅在必要时才创建或初始化对象。以下代码给出了一个示例:
import java.util.ArrayList;
import java.util.List;

public class Books {
    private List books;
    
    public List getBooks() {
        //Initialize if required
        if(null == books) {
            books = new ArrayList();
        }
        return books;
    }
}

 
3.返回空集合而不是空
如果程序返回的集合没有任何值,请确保返回Empty集合而不是Null元素。它将节省大量if-else 有关Null Elements的检查。以下代码将帮助您:
public List getBooks() {
    if (null == books) {
        books = new ArrayList();
    }
    return books;
}

 
4.使用逻辑运算符检查奇数
看一下下面的代码行,并确定它们是否可用于精确识别给定数字是否为奇数:
public boolean oddOrNot(int num) {
    return num % 2 == 1;
}

这些行看似正确,但从统计学上讲,它们每四次就会返回不正确的结果。如果使用负的奇数,则除以2的余数将不为1。因此,返回的结果将为false,这是不正确的!
可以将其修复如下:

public boolean oddOrNot(int num) {
    return (num & 1) != 0;
}

使用此代码,不仅可以解决负奇数的问题,而且还对代码进行了高度优化。由于逻辑运算乘法比除法快得多,因此在第二个代码段中可以更快地获得结果。
 
5.避免内存泄漏
内存泄漏通常会导致软件性能下降。由于Java自动管理内存,因此开发人员没有太多控制权。但是,仍有一些标准做法可以用来保护您的应用程序免受内存泄漏的影响。

  • 查询完成后,请始终释放数据库连接。
  • 尝试尽可能多地使用一个Finally块。
  • 释放存储在静态表中的实例。

 

6.必要时使用手动操作
为了提高计算能力,Java提供了两种选择:
1.乘法:
double square = double a * double a;                            // Optimized
double cube = double a * double a * double a;                  
// Non-optimized
double cube = double a * double square;                        
// Optimized
double quad = double a * double a * double a * double a;            
// Non-optimized
double quad = double square * double square;                    
// Optimized

2. Math.pow
pow方法用于计算不可能进行乘法的地方(基数指数)
double cube = Math.pow(base, exponent);

Math.pow()仅在必要时使用。例如,如果指数是一个小数值。那是因为Math.pow()方法通常比乘法慢300-600倍。
 
7.避免对索引使用For循环
请不要使用带有索引(或计数器)变量的for循环。通常,索引变量容易出错,因为我们可能会在循环的主体中意外更改它,或者我们可能从1而不是0开始索引。
示例遍历字符串数组:

String[] names = {"Alice", "Bob", "Carol", "David", "Eric", "Frank"};
for (int i = 0; i < names.length; i++) {
      doSomething(names[i]);
}

索引变量i在for循环中是改变的,这可能会导致意外结果。我们可以通过使用如下所示的增强for循环来避免潜在的问题:
for (String aName :names){
     doSomething(aName);
}

这不仅消除了潜在的问题,而且使代码更简洁。
 
8.选择正确的时间操作
有两种使用Java进行时间操作的标准方法:System.currentTimeMillis()和System.nanoTime()。
问题是,您应在哪种情况下选择哪种?原则上,它们都执行相同的操作,但在以下方面有所不同:
  1. System.currentTimeMillis()需要大约1/1000秒到15/1000秒之间的时间(取决于系统),但是System.nanoTime()大约需要1 / 1000,000秒(1,000纳米)
  2. System.currentTimeMillis()花费几个时钟周期执行读取操作,而System.nanoTime()花费100个以上时钟周期。
  3. System.currentTimeMillis()反映了绝对时间(自1970年1月1日以来的毫秒数00:00(Epoch时间)),但System.nanoTime()不一定代表任何参考点。