java 中的字符串和流程控制+面试题

算数运算符:

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接受,所以程序会报错

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值