算数运算符:
Java中的算数运算符,重点讲++和--
先看"++"的基本使用:
int i=1;
int i2=++i;//++i相当于i=i+1;
System.out.println(i);//2
System.out.println(i2);//2
++和++i的区别
++i先自加再赋值
i++先赋值再自加
比如:
int i=0;
int i2=i++;
int j=0;
int j2=++j;
System.out.println("i2="+i2);
System.out.println("j2="+j2);
输出的结果:i2=0;
j2=1
代码解析:i++是先给i2赋值再自身+1,所以i2=0,而++j是先自加等于1后之后,再赋值给j2,所以j2等于1
注意事项:
++/--是非线程安全的,也就是在++/--操作在多线程条件下可能会发生混乱,例如:
new Thread(){
@Override
public void run(){
for(int i=0;i<100000;i++){
System.out.println("thread:"+this.getName()+",count="+(++count));
}
}
}.start();
new Thread(){
@Override
public void run(){
for(int i=0; i<100000;i++){
System.out.println("threadz:"+this.getName()+",count="+(++count));
}
}
}.start();
执行的结果
thread.Thread-0,count=199988
thread.Thread-0,count=199989
thread.Thread-0,count=199990
thread.Thread-0,count=199991
thread.Thread-0,count=199992
thread.Thread-0,count=199993
thread.Thread-0,count=199994
thread.Thread-0,count=199995
thread.Thread-0,count=199996
thread.Thread-0,count=199997
如上所示:
每台机器的执行可能略有差距,但大多数情况下并不能给我们想要的真是值200000
原理分析:
"++"操作在多线程下引发混乱的原因:因为++操作对于底层操作系统来说,并不是一条CPU操作指令,而是三条CPU操作指令----取值,累加,存储,因此无法保证原子性,就会出现上面代码执行后的误差
如何避免++/--操作在多线程下的误差?
方法1:++/--操作放在同步块synchronized中
方法2:自己申明锁,把++/--操作放入其中
方法3:使用Atomicinteger类型代替int类型
最后,因为--语法和++完全一致,所以--的操作,请参照上面的++语法
条件运算符(三元运算符)
条件操作符(三元运算符)
条件运算符(?:)也叫"三元运算符".
语法:
布尔表达式?表达式一:表达式二
运算过程:如果布尔表达式的值为true,则返回表达式1的值,否则返回表达式2的值
例如:String s=3>1?"三大于一":"三小于一";
System.out.println(s);
执行结果:三大于一
流程控制
在Java语言控制中,使用条件语句和循环结构来实现流程控制
1.条件语句
条件语句的语法表达式:
if(........)........
其中的条件语句必须使用括号括起来不能省略
基础语法使用:
int i=1;
if(i>1){
System.out.println("i>1");
}else if(i==1){
System.out.println("i=1");
}else{
System.out.println("其他");
}
2.循环
while当条件成立的时候执行下一条语句
while语法格式:
while(.......)........
基本语法使用:
int i=0;
while(i<3){
System.out.println(++i);
}
while是先判断再决定是否执行,有可能一次也不执行,如果希望至少执行一次,可以使用do/while
do/while语法格式:
do{......}while(.....);
基本语法使用
int i1=0;
do{
System.out.println(++i1);
}while(i1<3);
3.确定循环
for循环是程序中最长使用的循环之一,它是利用每次迭代之后更新计数器来控制循环的次数
for语法格式:
for(int i=0;i<n;i++){.....}
基础语法使用:
for(int i=0;i<10;i++){
System.out.println("i="+i);
}
for循环中使用continue关键字,跳过后继续操作,继续下一次迭代
例如:
for(int i=1;i<4;i++){
if(i==2) continue;
System.out.println("i="+i);
}
执行结果:
i=1;
i=3;
如结果所示,第二次循环就会跳过,执行下一次循环
for注意事项
在循环中检查两个浮点数是否相等要格外小心,例如以下代码
public static void main(String[] args) {
for(float i=0;i!=1;i+=0.1){
System.out.println(i);
}
}
循环永远停不下来,由于舍入误差,因为0.1无法精确的用二级制表示,所以上面代码到0.9000001之后 ,会直接跳到1.0000001,不会等于1,所以循环就永远不会停下来
4.多重选择
switch的特点是可以判断多个条件,if的特点是执行少量判断,它们两个刚好可以形成互补的关系
switch语法格式:
swich(........){case 1:......break;......default:.......break;}
switch基础使用:
int i = 3;
switch (i) {
case 1:
System.out.println("等于1");
break;
case 2:
System.out.println("等于2");
break;
case 3:
System.out.println("等于3");
break;
default:
System.out.println("等于其他");
break;
}
可用于case的类型有:
byte,char,short,int
枚举
字符串(javaSE 7新加入)
switch注意事项:
switch使用时,每个选项最末尾一定不要忘记加break关键字,否则会执行多个条件
int i = 1;
switch (i) {
case 1:
System.out.println("等于1");
case 2:
System.out.println("等于2");
case 3:
System.out.println("等于3");
break;
default:
System.out.println("等于其他");
}
程序执行的结果:
等于1
等于2
等于3
等于其他
所以使用switch时,每个选项的末尾一定得加break关键字
相关面试题
1.java中i++和++i有什么区别?
答:i先赋值再运算;i先运算再赋值
示例代码:
int i=0;
int i2=i++;
int j=0;
int j2=++j;
System.out.println("i2="+i2);
System.out.println("j2="+j2);
输出结果:i2=0,j2=1;
2.以下代码i的值是多少?
int i=0;
i=i++;
System.out.println(i);
答:0
题目解析:因为java虚拟机在执行i++时,把这个值赋值给了i,而i++是先赋值再相加,所以这个时侯i接收的结果自然是0了
3.以下代码i2和i3的值分别为多少
int i=0; int i2=i++; int i3=++i;
i2=0 i3=2
4.以下代码能不能正常执行?
if(true) System.out.println("laowang");
答:可以正常执行,其中判断条件的括号不能省略,大括号可以省略(作者并不建议为了省略代码而牺牲代码的可读性)
5.以下switch执行的结果是什么?
switch(num){ case 0: System.out.println("0"); case 1: System.out.println("1"); case 2: System.out.println("2"); case 3: System.out.println("3"); default: System.out.println("default"); }
答:1 2 3 default
6.switch能否用在byte类型的判断上?能否用在long类型的判断上?
switch支持byte类型的判断,不支持long类型的判断
题目解析:
switch支持的全部类型(JDK8):char,byte,short,int,Characher,Byte,Short,Integer,String,enums
7.while必须配合break一起使用的说法正确吗?
错误,while可以单独使用
int i=0; while (i<3){ System.out.println(++i); }
8.以下代码可以正常执行码?为什么?
int i=0; while(i<3){ if(i==2){ return; } System.out.println(++i); }
执行结果:1 2
答:可以正常执行,这里的return和break效果是一致的,while可以配合return或break一起使用
9.以下的程序执行结果是什么?
int i = 0; do { System.out.println(++i); } while (i < 3);
答:编译器报错,do/while之后必须使用;结尾
10.以下程序的输出结果是什么?
String s=new String("laowang"); String s2=new String("laowang"); System.out.println(s==s2); switch(s){ case "laowang": System.out.println("laowang"); break; default: System.out.println("default"); break; }
答:false ,laowang
11.以下代码循环了几次?
for(float i=0;i!=10;i+=0.1){ System.out.println("hi");
答:循环了无数次,循环永远不会停下来,由于舍入误差,因为0.1无法精确的用二级制表示,所以以上代码到0.90000001之后,会直接跳到1.0000001,不会等于1,所以循环就永远不会停下来
12.以下代码输出的结果是什么?
int num=-4; System.out.println(num%2==1||num % 2 == -1);
结果为false,-4%2=0既不等于1也不等于-1,所以结果为false
13.以下代码输出的结果是?
int num=4; num=((num&1)==1); System.out.println(num); 解析:程序报错.==运算返回的是boolean类型,不能用int接受,所以程序会报错