05、运算符

01、算术运算符


  • 用于基本数学运算
运算符含义示例结果
+加法int a = 5 + 3;a = 8
-减法int b = 10 - 4;b = 6
*乘法int c = 2 * 6;c = 12
/除法double d = 10.0 / 3;d ≈ 3.333
%取模(求 余数)int e = 10 % 3;e = 1
++自增int x = 5; x++;x = 6
自减int y = 5; y–;y = 4
  • 注意
  • 1、++ 和 – 可前置后置
  • 2、整数除法,会直接去掉结果中的小数部分,返回一个整数结果(不是四舍五入)。
public class JavaOperator {
   /**
     * 算术运算符
     */
    public static void arithmeticOperator(){
        int a = 5 + 3;
        System.out.println(a);
        int b = 10 - 4;
        System.out.println(b);
        int c = 2 * 6;
        System.out.println(c);
        double d = 10.0 / 6;
        System.out.println(d);

        // 直接舍弃小数部分(不是 四舍五入)。
        int e = 10 / 6;
        System.out.println(e);
        int f = 10 % 3;
        System.out.println(f);

        int g = 5;
        int h = g++;
        System.out.println(h);
        int i = 5;
        int j = ++i;
        System.out.println(j);

        int k = 5;
        int l = k--;
        System.out.println(l);
        int m = 5;
        int n = --m;
        System.out.println(n);
    }
}

02、赋值运算符


  • 变量赋值。
运算符含义示例等价于
=直接赋值int a = 5;-
+=加后赋值a += 3;a = a + 3;
-=减后赋值a -= 2;a = a - 2;
*=乘后赋值a *= 4;a = a * 4;
/=除后赋值a /= 2;a = a / 2;
%=取模后赋值a %= 3;a = a % 3;
&=位与后赋值a &= b;a = a & b;
|=位或后赋值a |= b;a = a | b;
^=位异或后赋值a ^= b;a = a ^ b;
<<=左移后赋值a <<= 2;a = a << 2;
>>=右移后赋值a >>= 1;a = a >> 1;
>>>=无符号右移后赋值a >>>= 1;a = a >>> 1;


03、关系运算符


  • 用于比较两个值的关系,返回布尔值 true/false。
运算符含义示例结果
==等于5 == 3false
!=不等于5 != 3true
>大于5 > 3true
<小于5 < 3false
>=大于等于5 >= 5true
<=小于等于5 <= 3false

04、逻辑运算符

  • 用于布尔逻辑运算。
运算符含义示例结果
&&逻辑与(短路)(5 > 3) && (2 < 4)true
||逻辑或(短路)(5 < 3) || (2 < 4)true
!逻辑非!(5 < 3)true
  • 非短路逻辑运算符(不建议用于布尔值)
运算符含义示例行为
&逻辑与(非短路)(false) & (x++ > 0)右侧仍执行
|逻辑或(非短路)(true) | (y-- < 0)右侧仍执行
  • 注意
    • 短路特性:&& 和 || 若左侧可确定结果,右侧不执行:
    • 非短路行为:& 和 | 会对两侧表达式均求值(即使左侧已确定结果)。
      • 通常用于位运算,逻辑场景 不推荐使用。
int x = 5;
// 短路特性
boolean result = (false && (x++ > 0)); // x 不自增,result = false
  • & :按位与:只要有一个为 false,则直接返回 false 。
  • | :按位或:只要有一个为 true,则直接返回 true 。
  • ~ :按位非:如果为 true,则返回 false,如果为 false,则返回 true 。
  • ^ :按位异或:如果两个操作数相同,则返回 false,如果两个操作数不同,则返回 true

05、位运算符


  • 直接操作二进制位(仅用于整数类型)。
运算符含义示例(二进制)结果(二进制)
&按位与
(同时为 1 ,才位 1)
5 & 3 (101 & 011)001 (1)
|按位或
(有一个为 1 就为 1 )
5 | 3 (101 | 011)111 (7)
^按位异或
(一个为 1 一个为 0 ,才位 1)
5 ^ 3 (101 ^ 011)
5 ^ 5 (101 ^ 101)
110 (6)
000 (0)
~按位取反~5 (补码取反)-6(具体依赖位数)
<<左移5 << 1 (101 → 1010)10
>>带符号右移-5 >> 1 (保留符号位)-3
>>>无符号右移-5 >>> 1(高位补 0 )大正数(依赖位数)
  • >>:
    • 正整数:符号右移 n 位,结果的补码等于在原来补码的高位补了 n 个 0 ,低位溢出舍弃。
    • 负整数:符号右移 n 位,结果的补码等于在原来补码的高位补了 n 个 1 ,低位溢出舍弃。
  • >>>:
    • 正整数:符号右移 n 位,结果的补码等于在原来补码的高位补了 n 个 0 ,低位溢出舍弃。
    • 负整数:符号右移 n 位,结果的补码等于在原来补码的高位补了 n 个 0 ,低位溢出舍弃。
/**
 * 右移
 *
 * @param n
 */
public static void signedRightShift(int n) {
    System.out.println(n + " 的有符号右移...........");
    System.out.println("参数的二进制补码是:" + Integer.toBinaryString(n));
    // 有符号右移三位
    int a = n >> 3;
    System.out.println("结果的二进制补码是:" + Integer.toBinaryString(a));
    System.out.println("十进制结果是:" + a);

    System.out.println();
}

/**
 * 无符号右移
 *
 * @param n
 */
public static void unsignedRightShift(int n) {
    System.out.println(n + " 的无符号右移...........");
    System.out.println("参数的二进制补码是:" + Integer.toBinaryString(n));
    // 无符号右移三位
    int a = n >>> 3;
    System.out.println("结果的二进制补码是:" + Integer.toBinaryString(a));
    System.out.println("十进制结果是:" + a);
    System.out.println();
}

public static void main(String[] args) {

    /*
     11 的有符号右移...........
    参数的二进制补码是:1011
    结果的二进制补码是:1
    十进制结果是:1
     */
    signedRightShift(11);

    /*
     11 的无符号右移...........
    参数的二进制补码是:1011
    结果的二进制补码是:1
    十进制结果是:1
     */
    unsignedRightShift(11);

    /*
    -11 的有符号右移...........
    参数的二进制补码是:11111111111111111111111111110101
    结果的二进制补码是:11111111111111111111111111111110
    十进制结果是:-2

    -2       的补码是:11111111111111111111111111110
     */
    signedRightShift(-11);
    System.out.println("-2       的补码是:" + Integer.toBinaryString(536870910));
    System.out.println();

    /*
    -11 的无符号右移...........
    参数的二进制补码是:11111111111111111111111111110101
    结果的二进制补码是:11111111111111111111111111110
    十进制结果是:536870910

    536870910的补码是:11111111111111111111111111110
     */
    unsignedRightShift(-11);
    System.out.println("536870910的补码是:" + Integer.toBinaryString(536870910));

    System.out.println();
    // 二进制位,相同则为 0, 不同则为 1 。  所以,输出:5^5 = 0
    System.out.println("5^5 = " + (5^5));
}

06、条件运算符(三元运算符 / 三目运算符)


  • 简化条件判断的表达式。
运算符含义示例结果
?:条件表达式int max = (a > b) ? a : b;返回较大值

07、其它运算符


1、 instanceof – 模式匹配
  • 检查对象是否属于某个类:
String name = "James";
// 由于 name 是 String 类型,所以返回真
boolean result = name instanceof String;
  • Java16 之前的使用:
if (staff[i] instanceof Manager) {
    Manager boss = (Manager)staff[i];
    boss.setBonus(000);
}
  • Java16 的使用:
    • 声明变量 的 instanceof 形式称为“模式匹配”。
      • 因为,它类似于 switch 中的类型模式(Java17 才有)。
if (staff[i] instanceof Manager boss) {
    boss.setBonus(000);
}

2、 new
  • 创建对象实例:
Object obj = new Object();

3、 . (成员访问)
  • 访问对象的属性方法
String s = "Hello";
int len = s.length(); // len = 5

4、 [] (数组访问)
  • 访问数组元素:
int[] arr = {1, 2, 3};
int num = arr[0]; // num = 1

08、运算符 的 优先级

  • 从高到低(部分常见运算符):
  1. ()、[]、.
  2. !、~、++、–
  3. *、/、%
  4. +、-
  5. <<、>>、>>>
  6. <、>、<=、>=、instanceof
  7. ==、!=
  8. &、^、|
  9. &&、||
  10. ?:
  11. =、+=、-= 等复合赋值运算符

09、5 * 4 最快的运算方式是?


  • 位运算 5<< 2 。

10、什么情况下,加号会变成 字符串连接符?


  • “+” 号左右,一边为 String 类型时,则变成字符连接符。

  • 第一个输出:
    • 首先, 10 和 20 被视为数字,相加为 30。
    • 然后,30 被视为字符串,并与字符串 Javatpoint 连接。因此,输出将为 30Javatpoint
  • 第二个输出:
    • 字符串 Javatpoint 与 10 连接成字符串 Javatpoint10,然后与 20 连接成 Javatpoint1020
class Test {  
    public static void main (String args[]) { 
        // 输出结果:30Javatpoint
        System.out.println(10 + 20 + "Javatpoint");   
        // 输出结果:Javatpoint1020
        System.out.println("Javatpoint" + 10 + 20);  
    }  
}  

  • 第一个输出:
    • 首先,将数字 10 和 20 相乘。
    • 然后,将结果 200 视为字符串并与字符串 Javatpoint 连接以生成输出 200Javatpoint
  • 第二个输出:
    • 数字 10 和 20 将首先乘以 200,因为乘法的优先级高于加法。
    • 结果 200 将被视为字符串,并与字符串 Javatpoint 连接,以生成 Javatpoint200 的输出。
class Test {  
    public static void main (String args[]) { 
        // 输出结果:200Javatpoint
        System.out.println(10 * 20 + "Javatpoint");   
        // 输出结果:Javatpoint200
        System.out.println("Javatpoint" + 10 * 20);  
    }  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值