35个可以飞快提高千倍效率的Java语言代码小技巧,你值得拥有!( 四 )


int i = 2;if (i == 1){...}else{...}C/C++判断”i==1″不成立 , 所以以0表示 , 即false 。但是如果:
int i = 2;if (i = 1) { ... }else{ ... }万一程序员一个不小心 , 把”if (i == 1)”写成”if (i = 1)” , 这样就有问题了 。在if之内将i赋值为1 , if判断里面的内容非0 , 返回的就是true了 , 但是明明i为2 , 比较的值是1 , 应该返回的false 。这种情况在C/C++的开发中是很可能发生的并且会导致一些难以理解的错误产生 , 所以 , 为了避免开发者在if语句中不正确的赋值操作 , 建议将if语句写为:int i = 2;if (1 == i) { ... }else{ ... }这样 , 即使开发者不小心写成了”1 = i” , C/C++编译器也可以第一时间检查出来 , 因为我们可以对一个变量赋值i为1 , 但是不能对一个常量赋值1为i 。但是 , 在Java中 , C/C++这种”if (i = 1)”的语法是不可能出现的 , 因为一旦写了这种语法 , Java就会编译报错”Type mismatch: cannot convert from int to boolean” 。但是 , 尽管Java的”if (i == 1)”和”if (1 == i)”在语义上没有任何区别 , 但是从阅读习惯上讲 , 建议使用前者会更好些 。
30、不要对数组使用toString()方法
看一下对数组使用toString()打印出来的是什么:
public static void main(String[] args){ int[] is = new int[]{1, 2, 3};System.out.println(is.toString());}结果是:
[I@18a992f本意是想打印出数组内容 , 却有可能因为数组引用is为空而导致空指针异常 。不过虽然对数组toString()没有意义 , 但是对集合toString()是可以打印出集合里面的内容的 , 因为集合的父类AbstractCollections重写了Object的toString()方法 。31、不要对超出范围的基本数据类型做向下强制转型
这绝不会得到想要的结果:
public static void main(String[] args){long l = 12345678901234L;int i = (int)l;System.out.println(i);}我们可能期望得到其中的某几位 , 但是结果却是:
1942892530解释一下 。Java中long是8个字节64位的 , 所以12345678901234在计算机中的表示应该是:
0000 0000 0000 0000 0000 1011 0011 1010 0111 0011 1100 1110 0010 1111 1111 0010一个int型数据是4个字节32位的 , 从低位取出上面这串二进制数据的前32位是:
0111 0011 1100 1110 0010 1111 1111 0010这串二进制表示为十进制1942892530 , 所以就是我们上面的控制台上输出的内容 。从这个例子上还能顺便得到两个结论:
1、整型默认的数据类型是int , long l = 12345678901234L , 这个数字已经超出了int的范围了 , 所以最后有一个L , 表示这是一个long型数 。顺便 , 浮点型的默认类型是double , 所以定义float的时候要写成””float f = 3.5f”
2、接下来再写一句”int ii = l + i;”会报错 , 因为long + int是一个long , 不能赋值给int
32、公用的集合类中不使用的数据一定要及时remove掉
如果一个集合类是公用的(也就是说不是方法里面的属性) , 那么这个集合里面的元素是不会自动释放的 , 因为始终有引用指向它们 。所以 , 如果公用集合里面的某些数据不使用而不去remove掉它们 , 那么将会造成这个公用集合不断增大 , 使得系统有内存泄露的隐患 。
33、把一个基本数据类型转为字符串 , 基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+””最慢
把一个基本数据类型转为一般有三种方式 , 我有一个Integer型数据i , 可以使用i.toString()、String.valueOf(i)、i+””三种方式 , 三种方式的效率如何 , 看一个测试:

35个可以飞快提高千倍效率的Java语言代码小技巧,你值得拥有!

文章插图
 
运行结果为:
String.valueOf():11ms Integer.toString():5ms i + "":25ms所以以后遇到把一个基本数据类型转为String的时候 , 优先考虑使用toString()方法 。至于为什么 , 很简单:1、String.valueOf()方法底层调用了Integer.toString()方法 , 但是会在调用前做空判断
2、Integer.toString()方法就不说了 , 直接调用了
3、i + “”底层使用了StringBuilder实现 , 先用Append方法拼接 , 再用toString()方法获取字符串


推荐阅读