Java基础 操作符中碰到的易混淆的点

++i与i++

i++;
++i;

单独的一条语句++i,i++没有区别

int i=1;
System.out.println(i++);

在这里插入图片描述

int i=1;
System.out.println(++i);

在这里插入图片描述
i++; 先取值,再运算
++i; 先运算,再取值

int i=1;
int j=++i + i++ + ++i + ++i + i++;
 /*2+2+4+5+5*/
System.out.println(j);

在这里插入图片描述

==是值相等还是地址

==运算符表示指向字符串的引用是否相同
基本数据类型,存储直接是值, 不存地址,所以==是比较值;
而java中字符串的值是不可改变的,相同的字符串在内存中只会存一份,i,j指向的是同一对象

  	  String i="hello";
      String j="hello";
      int a=1;
      int b=1;
      System.out.println(a==b);
      System.out.println(i==j);

在这里插入图片描述

而new了一个新的String对象后i,j的地址就不同了

	  String i="hello";
      String j=new String("hello");
      System.out.println(i==j);

在这里插入图片描述所以比较字符串的内容是否相等还是用equals

	  String i="hello";
      String j=new String("hello");
      System.out.println(i==j);
      System.out.println(i.equals(j));

在这里插入图片描述注:对于基础类型,==相对宽松,不同的基础数据类型允许类型转换,而 === 相对严格,与 ==的区别在与不运行类型转换(js)

	  int a=1;
      float b=1;
      System.out.println(a==b);

在这里插入图片描述

& 和 &&(与),| 和 | | (或)

&&是逻辑与运算符,&是位运算符与,&&又叫短路运算符

按位与:a&b是把a和b都转换成二进制数然后再进行与的运算
逻辑与:a&&b就是当且仅当两个操作数均为true时,其结果才为true;只要有一个为false,a&&b就为false

& 不管前面的条件是否正确,后面都执行
&& 前面条件正确时,才执行后面,不正确时,就不执行(所以称为短路运算符)

        int i=1;
        System.out.println(i==2 & i++ ==2);
        System.out.println(i);

在这里插入图片描述i==2为false,继续执行了i++ == 2;

        int i=1;
        System.out.println(i==2 && i++ ==2);
        System.out.println(i);

在这里插入图片描述
i==2为false,直接结束不运行后面的运算单元

||是逻辑或运算符,|是按位或操作,||也称为短路或
与&,&&类似
按位或:a | b是把a和b都转换成二进制数然后再进行或的运算
逻辑或:a | | b就是当且仅当两个操作数均为false时,其结果才为false;只要有一个为true,a | | b就为true

| 不管前面的条件是否正确,后面都执行
| | 前面条件正确时,不执行后面

        int i=1;
        int j=1;
        System.out.println(i==1 || i++ ==2);
        System.out.println("i="+i);
        System.out.println(j==1 | j++ ==2);
        System.out.println("j=="+j);

在这里插入图片描述就效率来说&&和||更好一些

位操作符<<、>>、>>>

<<表示左移移,不分正负数,低位补0;
>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;
>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0

        int i=8;
        int j=-7;
        //8的二进制表示1000,-7二进制表示为补码
        System.out.println(Integer.toBinaryString(i)+","+Integer.toBinaryString(j));
        //8,-7左移两位
        System.out.println("8左移两位:"+(i<<2)+" 二进制表示:"+Integer.toBinaryString(i<<2));
        System.out.println("-7左移两位:"+(j<<2)+" 二进制表示:"+Integer.toBinaryString(j<<2));
        //8,-7右移两位
        System.out.println("8右移两位:"+(i>>2)+" 二进制表示:"+Integer.toBinaryString(i>>2));
        System.out.println("-7右移两位:"+(j>>2)+" 二进制表示:"+Integer.toBinaryString(j>>2)+"长度:"+Integer.toBinaryString(j>>2).length());
        //>>>无符号右移
        System.out.println("-7无符号右移两位:"+(j>>>2)+"二进制表示:"+Integer.toBinaryString(j>>>2)+"长度:"+Integer.toBinaryString(j>>>2).length());

在这里插入图片描述

三元操作符 - 表达式?值1 :值2

表达式?值1:值2
如果表达式为真 返回值1
如果表达式为假 返回值2

        int i=1;
        int j= i==1 ? 2 : 3;
        System.out.println(j);

在这里插入图片描述可以用三元操作符替代简单的if-else语句,明显简洁多了

运算符优先级

在运算过程中,需要注意运算符优先级
在这里插入图片描述
百度:运算符优先级

发布了49 篇原创文章 · 获赞 0 · 访问量 1242

猜你喜欢

转载自blog.csdn.net/key_768/article/details/104156949
今日推荐