1. 算术运算符

int a = 10;
int b = 5;

System.out.println(a + b);//15
System.out.println(a - b);//5
System.out.println(a * b);//50
System.out.println(a / b);//2
System.out.println(a % b);//0

b = 3;
System.out.println(a + b);//13
System.out.println(a - b);//7
System.out.println(a * b);//30
System.out.println(a / b);//3
System.out.println(a % b);//1

注意,整数除法无论正负,都是向零取整。正数取模还是正数,负数取模还是负数。

除此之外,还有浮点数运算。

int a = 10;
float c = 3.0f;
double d = 3.0;
System.out.println(a / c); // 3.3333333
System.out.println(a / d); // 3.3333333333333335
System.out.println(a % c); // 1.0
System.out.println(a % d); // 1.0

但需要特别注意的是,当浮点数除以 0 的时候,结果为 Infinity 或者 NaN。

System.out.println(10.0 / 0.0); // Infinity
System.out.println(0.0 / 0.0); // NaN

Infinity 的中文意思是无穷大,NaN 的中文意思是这不是一个数字(Not a Number)。

算术运算符中还有两种特殊的运算符,自增运算符(++)和自减运算符(--),它们也叫做一元运算符,只有一个操作数。

int x = 10;
System.out.println(x++);//10 (11)  
System.out.println(++x);//12  
System.out.println(x--);//12 (11)  
System.out.println(--x);//10  

运算符在前面的,先计算,再赋值,但之后都会发生改变。(和C语言类似,不做赘述)。

2. 关系运算符

这个简单,直接看几个例子吧!

int a = 10, b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a < b); // true
System.out.println(a >= b); // false
System.out.println(a <= b); // true

3. 位运算符

System.out.println(Integer.toBinaryString(60)); // 111100
System.out.println(Integer.toBinaryString(13)); // 1101

若无特别说明,位运算在计算机中指的都是二进制数,二进制的相关运算也和C语言类似,这里就直接给出一些例子。

int a = 60, b = 13;
System.out.println("a 的二进制:" + Integer.toBinaryString(a)); // 111100
System.out.println("b 的二进制:" + Integer.toBinaryString(b)); // 1101

int c = a & b;
System.out.println("a & b:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a | b;
System.out.println("a | b:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a ^ b;
System.out.println("a ^ b:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = ~a;
System.out.println("~a:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a << 2;
System.out.println("a << 2:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a >> 2;
System.out.println("a >> 2:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a >>> 2;
System.out.println("a >>> 2:" + c + ",二进制是:" + Integer.toBinaryString(c));

在有些算法中,会使用到二进制运算,比如树状数组、HashMap等。

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

哈希表在计算键值的时候,可能会用到位运算。

public class FenwickTree {  
    private int[] tree;  
    private int n;  
  
    public FenwickTree(int n) {  
        this.n = n;  
        this.tree = new int[n + 1];  
    }  
  
    // 更新树状数组中的某个元素  
    public void update(int index, int delta) {  
        while (index <= n) {  
            tree[index] += delta;  
            index += index & -index;  
        }  
    }  
  
    // 查询从 1 到 index 的前缀和  
    public int query(int index) {  
        int sum = 0;  
        while (index > 0) {  
            sum += tree[index];  
            index -= index & -index;  
        }  
        return sum;  
    }  
  
    // 查询区间 [left, right] 的和  
    public int queryRange(int left, int right) {  
        return query(right) - query(left - 1);  
    }  
  
    public static void main(String[] args) {  
        FenwickTree fenwickTree = new FenwickTree(10);  
  
        // 更新元素  
        fenwickTree.update(1, 5);  
        fenwickTree.update(3, 7);  
        fenwickTree.update(8, 2);  
  
        // 查询前缀和  
        System.out.println("Prefix sum from 1 to 3: " + fenwickTree.query(3));  // 输出应为 12  
  
        // 查询区间和  
        System.out.println("Sum from 2 to 8: " + fenwickTree.queryRange(2, 8));  // 输出应为 16  
    }  
}

树状数组(Binary Indexed Tree,也称为 Fenwick 树)是一种用于高效处理前缀和问题的数据结构。

  • update(int index, int delta):更新树状数组中指定索引的值。
  • query(int index):查询从 1 到指定索引的前缀和。
  • queryRange(int left, int right):查询指定区间内的和。

4. 逻辑运算符

老一套了,需要特别注意的是逻辑短路的情况。也即当进行与操作时,如果第一个条件就为假,则直接返回假;当进行或操作时,如果第一个条件为真,则直接返回真。

int a=10;
int b=5;
int c=20;
System.out.println(a<b&&a<c);//false && true = false

System.out.println(a>b||a<c);//true || true = true

此外,还有 !, & , | 运算,!做取反操作,& 和 | 则没有短路特性。

5. 赋值运算符

int a=10;
int b=20;
a+=4;//a=a+4 (a=10+4)  
b-=4;//b=b-4 (b=20-4)  
System.out.println(a);
System.out.println(b);

需要注意类型转换问题和边界问题。

6. 三元运算符

int a=2;
int b=5;
int min=(a<b)?a:b;
System.out.println(min);

如果 ? 前面的条件为 true,则结果为 : 前的值,否则为 : 后的值。

7. 小结

本文全面介绍了Java运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等。通过阅读本文,您将了解到Java运算符的分类、用法和优先级,以及如何在实际开发中灵活运用各类运算符提高编程效率。

菜菜,捞捞~