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

如果学过其他语言,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=2
a=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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值