最近整理了一下过去所学的知道,觉得收获不少,都说学而时习之,不亦说乎。java之中有很多功能不经意之间会被我们遗忘,对此我也整理出来,做下总结,分享给大家,有误之处,希望大家指出批评。
1、System.out.println();
相信程序员写的最多的重复语句莫过于此,这个常用于打印输出、调试程序,可以说是无处不在。
默认的System.out是向控制台输出,但是,如果输出的信息量很大,要怎样轻易的观察到输出的结果呢?设置一下System.setOut(),该方法传入的是一个PrintStream类型的对象,即可将输出的内容输出到你指定的路径文件中。
PrintStream out = System.out; //保留默认System.out的输出对象
PrintStream ps = new PrintStream( "D:/log.txt"); //构建新的输出对象
System. setOut(ps);
Scanner scanner = new Scanner(System. in);
System. out.println( "请输入您的姓名:" );
String name = scanner.nextLine();
System. out.println( "您好:"+name);
System. setOut(out); //还原默认的输出对象
System. out.println( "执行OK");
2、位运算的妙用。
大家都知道:
1的二进制数:00000001
2的二进制数:00000010
4的二进制数:00000100
8的二进制数:00001000
观察其中的规律,可见左移一位,相当于乘以2,右移一位,相当于除以2。所以,乘以2的n次方的数可以用位运算来提高执行效率。
int numa = 5;
int numb = numa<<3;
int numc = numb>>1;
System. out.println(numb);
System. out.println( numc);
当然了,位运算还可以对两数进行交换,不过只支持整型。
int num[] = {11,33};
num[0] = num[0]^num[1];
num[1] = num[1]^num[0];
num[0] = num[0]^num[1];
System. out.println( "num[0]="+num[0]);
System. out.println( "num[1]="+num[1]);
3、对于高精度的加减乘除。BigDecimal
这个不用多说,相信许多程序员需要经常用到这个类。
double money = 2;
double price = 1.1;
double result = money - price;
System. out.println(result);
BigDecimal deMoney = new BigDecimal( "2");
BigDecimal dePrice = new BigDecimal( "1.1");
BigDecimal deResult = deMoney.subtract(dePrice);
System. out.println(deResult.toString());
记得BigDecimal()构造方法里传的是一个String类型的对象,如果直接传数值进去,也许得不到你所要的结果哦。
4、结束双层循环:
大家都知道,break是结束整个循环体,continue是结束单次循环,那么双层循环如何跳出,我想大部人都会,给大家复习一下吧。
不多说这就是结束双层循环的用法:
No1:for (int i = 0; i < 10; i++) { //用当前的for循环“取个名字”
for ( int j = 0; j < 10; j++) {
System. out.print( "i="+i+ ",j="+ j+"\t");
if(i== j) {
break No1; //跳出名字为“No1”的for
}
}
System. out.println();
}
5、“&”和“&&”的区别:
简单点的理解,
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。“|”和“||”的区别同理,双或时,左边为真,右边不参与运算。
public static void main(String[] args) {
String name = "java";
for( int i=0; i<5; i++) {
if(name.equals( "jav") && i++ ==0) { //&&前半句为假时,后半句将不执行
// if(name.equals("jav") & i++ ==0) { &无论前半句是真是假,后半句都将执行
break;
}
System. out.println(i);
}
}
这里还有一个初学者经常不理解的地方:异或( ^ )与或( | )的不同之处是,(^)是当左右都为true时,结果为false。(|)是只要其中有一个为true时,结果为true.两者是逻辑相反的。
6、switch语句选择的类型只有四种:byte,short,int , char????? NO!
jdk1.7以后,switch可以支持String类型的选择了。当然了,如果你想问1.7以前的版本要如何实现String类型的选择,得到字符的hashCode,返回的就是int 类型的数了。
public static void main(String[] args) {
String name = "java";
switch (name.hashCode()) {
case 3254818: //"java".hashCode()得到的数据
System. out. println("java");
break;
}
}
7、静态导入
import static java.lang.Math.*;这样就可以直接调用Math中的静态方法,如max(2,3);如果不导入就要写成Math.max(2,3);
import static java.lang.Math.*;这样就可以直接调用Math中的静态方法,如max(2,3);如果不导入就要写成Math.max(2,3);
8、我们常常要做一个关于字符串判断的操作,如下:
String name;
//通过一些方式,我得到了name的值。
name = "java";
//不推荐的用法
if(name.equals("java")) {
doSth...
}
//推荐用法
if("java".equals(name)) {
doSth....
}
原因,当我们所要判断的字符串为null时,会抛空指针异常。比如 你获取用户提交的参数,当并没有获取到这个参数,又对其进行了判断逻辑,如果使用了不推荐的方法,就会抛空指针异常。除非你的程序确实很健壮,确信在这个判断上根本不可能出现name为null的情况。
9、boolean值做为循环条件。
//不推荐用法
if(x==3){
doSth....
}
//推荐用法
if(3==x) {
doSth....
}
两则都是以判断x是否等于3的结果作为判断条件,但是人总有一疏忽,如果你不小心把代码写成了这种情况怎么办:
if(x=3){
doSth...
}else{
doSth...
}
如果在万千行代码中,不小心出了个这样的问题,情况好的时候,测试一下结果就发现问题,改正即可。人品不好的时候,你可能会一直以为程序运行正常。
而使用推荐的方法,你如果不小心把x==3写成x=3,IDE那条鲜艳的红线……不多说了。