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运算符的分类、用法和优先级,以及如何在实际开发中灵活运用各类运算符提高编程效率。