java学习笔记3——操作运算符

来源:互联网 发布:mysql压缩包下载地址 编辑:程序博客网 时间:2024/06/06 12:52

如果学过其他语言,java的运算符和其他的也差不多,这里介绍一些容易出错的

一、操作符:

  java的操作符和其他的语言一致,加(+)减(-)乘(*)除(/)赋值(=)。在这里不多做阐述,主要讲的还是一些难以理解或者而比较绕的点,比如自加(++)【自减也一样】,优先级,还有逻辑运算符(&&和||),左移右移,==和equals方法的区别,

(一)、自加(++)

  ++的使用和–一样,这里的话只以++为例子。一般此运算符的使用方法是这样的:a=b++,与之区别的是a=++b。我们知道a++的意思是a=a+1,那么放到赋值语句中有什么不同呢?
—>a=b++:
  这类用法的含义是,先使用b,即先把b赋值给a,然后执行b=b+1;如果设立一个中间值temp,可以用代码表示如下:

temp = b ;b = b + 1 ; a = temp;

—>a=++b:
  这类用法是,先对b进行自加,b=b+1,然后在进行赋值,a=b,可以用代码表示如下:

a = a +1 ; b = a;

这个时候不得不提一下一道面试题:

public static void main(String[] args) {      int i = 0;      for (int j = 0; j < 10; j++) {              i=i++;        }       System.out.println("i的结果是:"+i);      }  

  相信大家第一反应应该是i=10,但是i真的等于10吗,不妨我们把其中的i=i++按照上面简述的展开:

public static void main(String[] args) {      int i = 0;  int temp =0;    for (int j = 0; j < 10; j++) {              //i=i++;              temp=i;i=i+1;i=temp;      }       System.out.println("i的结果是:"+i);  //i结果是0    }  

  这下大家应该可以发现了,不管循环多少次,i的值都为0,这在笔试面试时经常会出现,算是java的一个自增陷阱。 其实java对该运算的处理也是这样的,会在内存中生成一个临时存储区,即temp来存储变量进行处理。

(二)优先级

java的运算符优先级,参照下表:
这里写图片描述
这里需要说明一点,强制类型转化的优先级比应该在1和2之间。例如:

float f = 1.7F;int i = (int)f *2;//答案为2,而不是3,因为先进行强制类型转化,然后再乘,这里损失了精度

所以,在这里提醒大家在实际开发中,对于摸不准的,要善于运用括号啊

(三)、逻辑运算符(&&和||)

  看着这两个就想起&(与),|(或)和^(异或),这里就是转化为二进制按位进行操作,或者是boolean类型的对比,这里不详细讲解。
  &&(短路与)和||(短路或)两侧加的是表达式,进行true和false的判断,遵循以下规则:

  • & 和 &&的区别
    • &:无论左边结果是什么,两边都参与运算
    • &&:当左边为false时,左边不参与运算
  • | 和 || 的区别
    • |:无论左边结果是什么,两边都参与运算
    • ||:当左边为ture是,右边不参与运算

  逻辑运算有异或,这里有一道题,怎么在不设置临时变量的情况下交换两个数的值,可以用^

public static void main(String[] args) {    int a = 1;    int b = 2;    System.out.println("a=" + a + ";b=" + b);    a = a ^ b;    b = a ^ b;    a = a ^ b;    System.out.println("a=" + a + ";b=" + b);}

结果:

a=1;b=2a=2;b=1

(四)左移右移

左移<< 就是n*2(位数) 实现2的次幂运算
右移>> 就是n/2(位数) 快速运算除以2的次幂
(>>:高位出现空位时,原高位时什么,就补什么)
(>>>:无论高位是什么,都补0(<<<也一样))

(五)==和equals方法的区别

先看一段代码:

public static void main(String[] args) {    int i = 1;    int j = 1;    Integer m = new Integer(1);    String a = "123";    String b = "123";    String c = new String("123");    String d = new String("123");    String st1 = "wasiker ";    String st2 = "is super man";    String st3 = "wasiker is super man";    String st4 = "wasiker is super man";    System.out.println(st1 == st2); //false    System.out.println((st1 + st2) == st3);//false    System.out.println(st3 == st4);//true    System.out.println(i == j);//true    System.out.println(i == m);//true    System.out.println(a == b);//true    System.out.println(c == d);//false    System.out.println(a == c);//false    System.out.println(m.equals(i));//true    System.out.println(a.equals(b));//true    System.out.println(c.equals(d));//true    System.out.println(a.equals(c));//true    }

可以总结:
1、==:如果两侧是基本数据类型,那么比较的是值(这里需要着重说明一下integer对象在==比较的时候,比如第17行,integer对象会自动拆箱变成int,进行值的比较,所以返回true);如果两侧是对象,那么比较的就是对象在内存中的地址
2、equals:比较的是两个对象的值是否相等,而不是比较地址
3、需要注意,String字符串想加的时候,会生成一个新的地址去指向结果,所以第14行比较的是地址,返回false。

0 0