一.将局部变量的作用域最小化
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。
要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。如果变量在使用之前进行声明,这只会造成混乱—–等到用到该变量的时候,读者可能已经记不起该变量的类型或者初始值。
局部变量定义的时候应该进行初始化,如果没有足够的信息对一个变量进行有意义的初始化,就应该推迟声明,直到可以初始化为止。
二.for-each循环优先于传统的for循环
在java1.5发行前,对集合进行遍历的首选做法是:
for(Iterator i = c.iterator(); i.hasNext()){
doSomething(i.next());
}
遍历数组做法是:
for(int i = 0; i < a.length; i++){
doSomething(a[i]);
}
在java 1.5发行版本中引入for-each循环,通过完全隐藏迭代器或者索引变量,避免了混论和出错的可能。这种模式同样适用于集合和数组:
for(Element e : elements){
doSomething(e);
}
利用for-each循环不会有性能的损失,比起普通的for循环,因为它对数组索引的边界值只计算一次,还稍有性能的优势。
但是以下三种情况无法使用for-each循环:
- 过滤
如果需要遍历集合,并删除选定的元素,就需要使用显式的迭代器,以便可以调用它的remove方法。 - 转换
如果需要遍历列表或者数组,并取代它部分或者全部的元素,就需要列表迭代器或者数组索引,以便设定元素的值 - 平行迭代
如果需要并行遍历多个集合,就需要显示的控制迭代器或者索引变量,以便所有迭代器或者索引变量都可以得到同步前移。
三.如果需要精确的答案,则避免使用float和double
float和double类型主要为了科学计算和工程计算而设计的,是为了在广泛的数值范围上提供较为精确的快速近似计算结果而精心设计的。然而,他们并没有提供完全精确的结果,所以不应该被应用于需要精确结果的场合,尤其货币的时候。因为要让一个float或者double精确地表示0.1(或者10的任何负数次方值)是不可能的,比如System.out.println(2.0-1.1)将会打印0.899999999999999,而不是你所希望的0.9,这种舍入错误产生的原因是浮点数实际上是用二进制系统实现的,而分数1/10在二进制系统中没有精确的表示,其道理就如同在十进制系统中无法精确表示1/3一样;
public class Test {
public static void main(String[] args) {
float aa = 1f;
double bb = 1;
System.out.println(aa-0.42);
System.out.println(bb-0.42);
}
}
解决这个问题的正确办法是使用BigDecimal,int或者long进行计算。
int,long就是让计算的单位变小,由元为单位变为分为单位,由浮点数变为整数进行计算。
下面来看下BigDecimal的常用用法:
public class Test {
public static void main(String[] args) {
BigDecimal aa = new BigDecimal("1.00");
BigDecimal bb = new BigDecimal("0.42");
System.out.println(aa.subtract(bb));
}
}