--- title: Java运算符详解:掌握各类运算符的使用与技巧 shortTitle: Java运算符 category: - Java核心 tag: - Java语法基础 description: 本文全面介绍了Java运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等。通过阅读本文,您将了解到Java运算符的分类、用法和优先级,以及如何在实际开发中灵活运用各类运算符提高编程效率。 head: - - meta - name: keywords content: Java, 运算符, 算术运算符, 关系运算符, 逻辑运算符, 位运算符, 赋值运算符, 运算符用法, 运算符优先级 --- # 3.6 Java运算符 “二哥,让我盲猜一下哈,运算符是不是指的就是加减乘除啊?”三妹的脸上泛着甜甜的笑容,我想她一定对提出的问题很有自信。 “是的,三妹。运算符在 Java 中占据着重要的位置,对程序的执行有着很大的帮助。除了常见的加减乘除,还有许多其他类型的运算符,来看下面这张思维导图。” ![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/core-grammar/eleven-01.png) ### 01、算术运算符 算术运算符除了最常见的加减乘除,还有一个取余的运算符,用于得到除法运算后的余数,来串代码感受下。 ```java 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 ``` 对于初学者来说,加法(+)、减法(-)、乘法(*)很好理解,但除法(/)和取余(%)会有一点点疑惑。在以往的认知里,10/3 是除不尽的,结果应该是 3.333333...,而不应该是 3。相应的,余数也不应该是 1。这是为什么呢? 因为数字在程序中可以分为两种,一种是整型,一种是浮点型(不清楚的同学可以回头看看[数据类型那篇](https://javabetter.cn/basic-grammar/basic-data-type.html)),整型和整型的运算结果就是整型,不会出现浮点型。否则,就会出现浮点型。 ```java 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。 ```java System.out.println(10.0 / 0.0); // Infinity System.out.println(0.0 / 0.0); // NaN ``` Infinity 的中文意思是无穷大,NaN 的中文意思是这不是一个数字(Not a Number)。 当整数除以 0 的时候(`10 / 0`),会抛出[异常](https://javabetter.cn/exception/gailan.html): ``` Exception in thread "main" java.lang.ArithmeticException: / by zero at com.itwanger.eleven.ArithmeticOperator.main(ArithmeticOperator.java:32) ``` 所以整数在进行除法运算时,需要先判断除数是否为 0,以免程序抛出异常。 算术运算符中还有两种特殊的运算符,自增运算符(++)和自减运算符(--),它们也叫做一元运算符,只有一个操作数。 ```java 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 ``` 一元运算符可以放在数字的前面或者后面,放在前面叫前自增(前自减),放在后面叫后自增(后自减)。 前自增和后自增是有区别的,拿 `int y = ++x` 这个表达式来说(x = 10),它可以拆分为 `x = x+1 = 11; y = x = 11`,所以表达式的结果为 `x = 11, y = 11`。拿 `int y = x++` 这个表达式来说(x = 10),它可以拆分为 `y = x = 10; x = x+1 = 11`,所以表达式的结果为 `x = 11, y = 10`。 ```java int x = 10; int y = ++x; System.out.println(y + " " + x);// 11 11 x = 10; y = x++; System.out.println(y + " " + x);// 10 11 ``` 对于前自减和后自减来说,你可以自己试一把。 ### 02、关系运算符 关系运算符用来比较两个操作数,返回结果为 true 或者 false。 ![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/core-grammar/eleven-02.png) 来看示例: ```java 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 ``` ### 03、位运算符 在学习位运算符之前,需要先学习一下二进制,因为位运算符操作的不是整型数值(int、long、short、char、byte)本身,而是整型数值对应的二进制。 ```java System.out.println(Integer.toBinaryString(60)); // 111100 System.out.println(Integer.toBinaryString(13)); // 1101 ``` 从程序的输出结果可以看得出来,60 的二进制是 0011 1100(用 0 补到 8 位),13 的二进制是 0000 1101。 PS:现代的二进制记数系统由戈特弗里德·威廉·莱布尼茨于 1679 年设计。莱布尼茨是德意志哲学家、数学家,历史上少见的通才。 ![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/core-grammar/eleven-03.png) 来看示例: ```java 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 在计算哈希值的时候: ```java static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } ``` 如果对位运算一点都不懂的话,遇到这样的源码就很吃力。所以说,虽然位运算用的少,但还是要懂。 1)按位左移运算符: ```java System.out.println(10<<2);//10*2^2=10*4=40 System.out.println(10<<3);//10*2^3=10*8=80 System.out.println(20<<2);//20*2^2=20*4=80 System.out.println(15<<4);//15*2^4=15*16=240 ``` `10<<2` 等于 10 乘以 2 的 2 次方;`10<<3` 等于 10 乘以 2 的 3 次方。 2)按位右移运算符: ```java System.out.println(10>>2);//10/2^2=10/4=2 System.out.println(20>>2);//20/2^2=20/4=5 System.out.println(20>>3);//20/2^3=20/8=2 ``` `10>>2` 等于 10 除以 2 的 2 次方;`20>>2` 等于 20 除以 2 的 2 次方。 ### 04、逻辑运算符 逻辑与运算符(&&):多个条件中只要有一个为 false 结果就为 false。 逻辑或运算符(||):多个条件只要有一个为 true 结果就为 true。 ```java int a=10; int b=5; int c=20; System.out.println(ab||ab|a