1、将局部变量的作用域最小化
java允许在任何可以出现语句的地方声明变量。要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。如果变量在使用之前进行声明,会对视图理解程序功能的读者造成混乱。
过早声明局部变量不仅会使它的作用域过早地扩展,而且结束得也过于晚。局部变量的作用域从它被声明的点开始扩展,一直到外围快的结束处。如果变量是在“使用它的块”之外声明的,当程序退出该块之后,该变量扔是可见的。
2、for-each循环优先于传统的for循环
java 1.5版本中引入了for-each循环,通过完全隐藏迭代器或者索引变量,避免了混乱和出错的可能。这种模式适用于集合和数组。
使用for-each循环不会有性能损失,实际上,在某些情况,比起普通的for循环,它还稍有些优势,因为它对数组索引的边界值只计算一次。在对多个集合进行嵌套迭代时,for-each循环相对于传统的for循环的优势更明显,代码也更简洁
Integer[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9}; List<Integer> list = new ArrayList<>(Arrays.asList(nums)); //传统for循环 for (int i = 0; i < list.size(); i++) { Integer n1 = list.get(i); for (int j = 0; j < list.size(); j++) { Integer n2 = list.get(j); System.out.println(n1 * n2); } } //for-each循环 for (Integer n1 : list) { for (Integer n2 : list) { System.out.println(n1 * n2); } }
3、如果需要精确的答案,请避免使用float和double
float和double类型主要是为了科学计算和工程计算而设计的。 它们执行二进制浮点预算,这是为了在广泛的数值范围上提供较为精准的快速近似计算而设计,它们并没有提供完全精确的结果,所以不应该用于需要精确结果的场合。尤其不适用于货币的计算,因为要让一个float和double精确的表示0.1或者10的任何其他负数次方值是不可能的。
4、基本类型优先于装箱基本类型
java 1.5版本增加了自动装箱和自动拆箱。这种特性模糊了但并没有完全抹去基本类型和装箱类型之前的区别。基本类型和装箱基本类型之间有三个主要区别:
①:基本类型只有值,而装箱基本类型具有与它们的值不同的同一性
②:基本类型只有功能完备的值,而每个装箱基本类型除了它对应的基本类型的功能值之外,还有个非功能值:null
③:基本类型通常比装箱基本类型更节省时间和空间
Integer num1 = 127; Integer num2 = 127; Integer num3 = 129; Integer num4 = 129; int num5 = 129; System.out.println(num1 == num2);// true num1和num2初始化时,自动装箱调用Integer.valueOf(int i)方法,JDK默认对-128至127的进行缓存 System.out.println(num3 == num4);// false 引用比较 System.out.println(num3 == num5);// true 自动拆箱,值比较
5、当心字符串连接的性能
字符串连接操作符(+)是吧多个字符串合并为一个字符串的便利途径,单它不适合运用在大规模的场景中,为连接n个字符串而重复地使用字符串连接操作符,需要n的平方及的时间。这是由于字符串不可变而导致的结果。当两个字符串连接在一起时,它们的内容都要被拷贝。为了获得更好的性能,使用StringBuilder或StringBuffer append方法代替。
6、通过接口引用对象
如果有合适的接口类型存在,那么对于参数、返回值、变量或域来说,就都应该使用接口类型进行声明。
当养成了接口作为类型的习惯,你的程序将会更加灵活。当你决定更换实现时,所需做的就只是更改构造器中的类的名称。