我为什么要写一篇有关Java语言技巧和陷阱的知识的认知的文章呢。其实这主要是为了归纳,使你我他都在使用Java语言的同行,共同交流,共同提高,使我们都有一定的驾驭能力。下面我总结一个小题目,来进一步分析一下。
一、处理返回结果的时候
下面看一段代码:
再看下面这段代码:
通过分析这两段代码,大家可能都认为没什么区别,都是实现一样的功能。但是严格的代码规范,要求我们在写代码的时候只能返回一个结果。第一段代码是通过两处返回结果;第二段代码就比较严谨了,通过一个变量,就表达了一进一出,不会产生歧义。
二、简化代码,也要考虑效率
根据上面的代码,有些程序员想过,能不能还能更简化呢?这样也不用看那复杂的代码,这也是我需要讲的。看下面这段代码:
这段代码是不是简洁多了。如果你想实现单语句的处理,就可以这样写了;如果是多语句,就不能这样写,还是需要老老实实的这样写:
三、了解掌握java基本数据类型
我曾经在面试那些应聘java程序员的时候,有的拥有三、四年工作经验的程序员,甚至还不如一个刚毕业的学生。基础知识不牢固,简单的问题都答不上来。我在这里重述一遍,java的基本数据类型有八种,分别是int 、double、boolean、long、char、float、byte、short类型,而String不是java的基本类型的,这一点是和其他语言在数据类型上是不同的。String是一个类,不是java语言的基本数据类型,但可以定义一个String对象,可以对字符串进行不同的操作。
四、尽量少用new去实例一个变量或一个对象
我们在使用String、boolean、Integer的时候,尽量少用new去实例一个对象;并且在使用定义类对象的时候,尽量少用new去实例。因为每当你实例一个对象或变量的时候,都会在内存中申请一块动态或静态区域,对于经常调用的Method或Param,可以定义Static,这样程序执行效率还是比较高的。
五、代码规范性,有效避免代码歧义
一般在编写代码的时候,在if语句中单语句,可以不用{}大括号,像如下代码:
编程经验比较丰富的程序员,是知道在多语句的时候,要加{}大括号的。不过不管单语句,还是多语句,加上{}大括号,语句比较清晰,不存在歧义,容易理解。代码如下:
六、避免多次定义,合理优化程序执行效率
通常我们在编写一个类的时候,这个类里面有很多方法,同时都会用到一些变量和对象。如果都在一个类里面,可以在类里面方法外定义,同时合理利用new对象。
在第一句Code中,会在内存中申请一个区域,存放字符串“ptrGain<>0”,在执行多次后,JVM中会检测内存中是否存在,如果存在,就不会再申请内存区域。在第二种Code中,在执行多次后,有多少次,就new多少次。
七、数据类型的转换,都会出现理解误区
我们看看如下程序,如果你是笔者,你如何做。
下列代码片段会输出什么内容?
char num='7';
System.out.println((int)num);
你是不是立即会想到输出是7呢?其实答案是55,应为是char类型,因为前面(int)做了隐式转化成ASSIC码。
八、单目运算,要注意运算规则
已知X、Y、Z的取值依次为5、6、7,写出执行下面的运算后X、Y、Z的取值:
X += --Y * Z++
X = ? Y = ?Z = ?
这样的运算题目,也是会让初学者眩晕的。我给出大家答案,X=40,Y=5,Z=8;为什么是这样,你就好好理解吧。
九、不是任何情况下都相等
请看如下试题:
下列代码会输出什么内容?
int[] a = { 1, 2, 3 };
int[] b = { 1, 2, 3 };
System.out.println(a == b);
有人说输出是true.我要说不要被表面的假象所迷惑,其实正确答案是false.为啥呢?a数组和b数组都是取的是内存地址,所以不可能为true.
十、java语言中length()的作用知多少
以前我的老师给我出过这样一道题:问使用方法length( )可以获得字符串或数组的长度吗?我当时想的没想,就说可以。后来老师在课堂上帮我纠正了错误,答案是不可以的。java语言中length()取的是char类型的,在获取长度的时候,应该这样写:
String test1="java";
String test2="java语言";
system.out.println(test1.getBytes().length)
system.out.println(test2.getBytes().length)
test1显示的是4
test2显示的是8
十一、容易忽视的语法错误
看如下试题:
下列代码是否能够正确编译运行?
int[] a;
for (int i = 0; i
a[i] = i * i;
这样的题也是容易造成忽悠大家的。说白了,因为a数组就没初始化,想当然就或出现错误。
十二、有时简单的运算也会让你摸不着头脑的
看如下程序段:
public class Mystery {
public static void main(String[] args) {
int i = StdIn.readInt();
int j = StdIn.readInt();
int k = i + j;
System.out.println(j);
System.out.println(k);
}
}
假设文件input.txt的内容是两个整数1和1,执行下列的命令:
java Mystery
我相信对于初、中级程序员十有八九都会做错。在这里我告诉大家,答案为5和8,您算对了吗?
步骤分解:
1.留意看上边StdIn做了两次输入操作,实际上j内存区域做了一次计算,所以后面做了位运算;
2.经过每次位运算,期间j的实际演变过程计算是2 3 4 5;
3.经过每次位运算,k的演变过程分别是2 4 6 8