程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • JavaSE - 基础篇

    • Java环境搭建
    • Java基础语法
    • Java数据类型
    • Java常量和变量
    • Java进制和存储
    • Java运算符
      • 前言
      • 1. 算术运算符
        • 1.加减乘除模
        • 2.“+”号的两种用法
        • 3.自加自减运算
      • 2. 关系运算符/比较运算符
      • 3. 逻辑运算符
      • 4. 条件运算符
      • 5. 位运算符
        • (1)左移:<<
        • (2)右移:>>
        • (3)无符号右移:>>>
        • (4)按位与:&
        • (5)按位或:|
        • (6)按位异或:^
        • (7)按位取反:~
      • 6. 赋值运算符
      • 7. 运算符优先级
      • 8. 标点符号
    • Java流程控制
    • Java数组
    • Java面向对象上
    • Java面向对象下
    • Java异常机制
    • Java枚举
    • Java反射机制
    • Java代理模式
    • Java泛型
    • Java序列化
    • Java多线程详解
    • Java线程池相关
  • Java
  • JavaSE - 基础篇
scholar
2024-03-17
目录

Java运算符

# 前言

Java以前自学过一些,现在工作了,时间太久有一些知识都遗忘了,今天开始就更新Java了,想着把之前的Java基础知识捡起来;从最基础的开始,打好Java基础,便于以后复习。也欢迎大家跟我一起复习。

在Java中,一共有38个运算符。

image-20210701164724830

运算符的分类:

  • 按照功能分:算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符、Lambda运算符
分类 运算符
算术运算符(7个) +、-、*、/、%、++、--
赋值运算符(12个) =、+=、-=、*=、/=、%=、>>=、<<=、>>>=、&=、|=、^=等
关系运算符(6个) >、>=、<、<=、==、!=
逻辑运算符(6个) &、|、^、!、&&、||
条件运算符(2个) (条件表达式)?结果1:结果2
位运算符(7个) &、|、^、~、<<、>>、>>>
Lambda运算符(1个) ->(后面学)
  • 按照操作数个数分:一元运算符(单目运算符)、二元运算符(双目运算符)、三元运算符 (三目运算符)
分类 运算符
一元运算符(单目运算符) 正号(+)、负号(-)、++、--、!、~
二元运算符(双目运算符) 除了一元和三元运算符剩下的都是二元运算符
三元运算符 (三目运算符) (条件表达式)?结果1:结果2

# 1. 算术运算符

算术运算符 符号解释
+ 加法运算,字符串连接运算,正号
- 减法运算,负号
* 乘法运算
/ 除法运算,整数/整数结果还是整数
% 求余运算,余数的符号只看被除数
++ 、 -- 自增自减运算

# 1.加减乘除模

public class OperatorDemo01 {
	public static void main(String[] args) {
		int a = 3;
		int b = 4;
		
		System.out.println(a + b);// 7
		System.out.println(a - b);// -1
		System.out.println(a * b);// 12
		System.out.println(a / b);// 计算机结果是0,为什么不是0.75呢?
		System.out.println(a % b);// 3
        
        System.out.println(5%2);//1
		System.out.println(5%-2);//1
		System.out.println(-5%2);//-1
		System.out.println(-5%-2);//-1		
		//商*除数 + 余数 = 被除数
		//5%-2  ==>商是-2,余数时1    (-2)*(-2)+1 = 5
		//-5%2  ==>商是-2,余数是-1   (-2)*2+(-1) = -4-1=-5
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 2.“+”号的两种用法

  • 第一种:对于+两边都是数值的话,+就是加法的意思
  • 第二种:对于+两边至少有一边是字符串得话,+就是拼接的意思
public class OperatorDemo02 {
	public static void main(String[] args) {
		// 字符串类型的变量基本使用
		// 数据类型 变量名称 = 数据值;
		String str1 = "Hello";
		System.out.println(str1); // Hello
		
		System.out.println("Hello" + "World"); // HelloWorld
		
		String str2 = "Java";
		// String + int --> String
		System.out.println(str2 + 520); // Java520
		// String + int + int
		// String		+ int
		// String
		System.out.println(str2 + 5 + 20); // Java520
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 3.自加自减运算

理解:++ 运算,变量自己的值加1。反之,-- 运算,变量自己的值减少1,用法与++ 一致。

1、单独使用

  • 变量在单独运算的时候,变量前++和变量后++,变量的是一样的;
  • 变量前++ :例如 ++a 。
  • 变量后++ :例如 a++ 。
public class OperatorDemo3 {
	public static void main(String[] args) {
		// 定义一个int类型的变量a
		int a = 3;
		//++a;
		a++;
        // 无论是变量前++还是变量后++,结果都是4
		System.out.println(a);
	}
}
1
2
3
4
5
6
7
8
9
10

2、复合使用

  • 和其他变量放在一起使用或者和输出语句放在一起使用,前++和后++就产生了不同。
  • 变量前++ :变量先自身加1,然后再取值。
  • 变量后++ :变量先取值,然后再自身加1。
public class OperatorDemo03 {
	public static void main(String[] args) {
		// 其他变量放在一起使用
		int x = 3;
		//int y = ++x; // y的值是4,x的值是4,
		int y = x++; // y的值是3,x的值是4
		
		System.out.println(x);
		System.out.println(y);
		System.out.println("==========");
        
		// 和输出语句一起
		int z = 5;
		//System.out.println(++z);// 输出结果是6,z的值也是6
		System.out.println(z++);// 输出结果是5,z的值是6
		System.out.println(z);
        
        int a = 1;
        a = a++;//(1)先取a的值“1”放操作数栈(2)a再自增,a=2(3)再把操作数栈中的"1"赋值给a,a=1

        int i = 1;
        int j = i++ + ++i * i++;
        /*
        从左往右加载
        (1)先算i++
        ①取i的值“1”放操作数栈
        ②i再自增 i=2
        (2)再算++i
        ①i先自增 i=3
        ②再取i的值“3”放操作数栈
        (3)再算i++
        ①取i的值“3”放操作数栈
        ②i再自增 i=4
        (4)先算乘法
        用操作数栈中3 * 3 = 9,并把9压会操作数栈
        (5)再算求和
        用操作数栈中的 1 + 9 = 10
        (6)最后算赋值
        j = 10
        */
	} 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  • 小结:
    • ++在前,先自加,后使用;
    • ++在后,先使用,后自加。
  • 分析
public class TestIncrementOperator1{
	public static void main(String[] args){
		int i = 1;
		i++;
		++i;
	}
}
1
2
3
4
5
6
7

image-20211217171149646

public class TestIncrementOperator2{
	public static void main(String[] args){
		int i = 1;
		i = i++;
	}
}
1
2
3
4
5
6
public class TestIncrementOperator3{
	public static void main(String[] args){
		int i = 1;
		i = ++i;
	}
}
1
2
3
4
5
6

image-20211217171420955

# 2. 关系运算符/比较运算符

关系运算符 符号解释
< 比较符号左边的数据是否小于右边的数据,如果小于结果是true。
> 比较符号左边的数据是否大于右边的数据,如果大于结果是true。
<= 比较符号左边的数据是否小于或者等于右边的数据,如果大于结果是false。
>= 比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是false。
== 比较符号两边数据是否相等,相等结果是true。
!= 不等于符号 ,如果符号两边的数据不相等,结果是true。
  • 比较运算符,是两个数据之间进行比较的运算,运算结果一定是boolean值true或者false 。
  • 其中>,<,>=,<=不支持boolean,String类型,==和!=支持boolean和String。
public class OperatorDemo05 {
	public static void main(String[] args) {
		int a = 3;
		int b = 4;

		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); // false
		System.out.println(a != b); // true
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 3. 逻辑运算符

  • 逻辑运算符,是用来连接两个布尔类型值的运算符(!除外),运算结果也是boolean值true或者false
逻辑运算符 符号解释 符号特点
& 与,且 有false则false
| 或 有true则true
^ 异或 相同为false,不同为true
! 非 非false则true,非true则false
&& 双与,短路与 左边为false,则右边就不看
|| 双或,短路或 左边为true,则右边就不看

&&和&区别,||和|区别:

  • **&&和&**区别:
    • &&和&结果一样,&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。
  • **||和|**区别:
    • ||和|结果一样,||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。
public class OperatorDemo06 {
	public static void main(String[] args) {
		int a = 3;
		int b = 4;
		int c = 5;

		// & 与,且;有false则false
		System.out.println((a > b) & (a > c)); 
		System.out.println((a > b) & (a < c)); 
		System.out.println((a < b) & (a > c)); 
		System.out.println((a < b) & (a < c)); 
		System.out.println("===============");
		// | 或;有true则true
		System.out.println((a > b) | (a > c)); 
		System.out.println((a > b) | (a < c)); 
		System.out.println((a < b) | (a > c));
		System.out.println((a < b) | (a < c));
		System.out.println("===============");
		// ^ 异或;相同为false,不同为true
		System.out.println((a > b) ^ (a > c));
		System.out.println((a > b) ^ (a < c)); 
		System.out.println((a < b) ^ (a > c)); 
		System.out.println((a < b) ^ (a < c)); 
		System.out.println("===============");
		// ! 非;非false则true,非true则false
		System.out.println(!false);
		System.out.println(!true);
        
        //&和&&的区别
        System.out.println((a > b) & (a++ > c)); 
        System.out.println("a = " + a);
        System.out.println((a > b) && (a++ > c)); 
        System.out.println("a = " + a);
        System.out.println((a == b) && (a++ > c)); 
        System.out.println("a = " + a);
        
        //|和||的区别
        System.out.println((a > b) | (a++ > c)); 
        System.out.println("a = " + a);
        System.out.println((a > b) || (a++ > c)); 
        System.out.println("a = " + a);
        System.out.println((a == b) || (a++ > c)); 
        System.out.println("a = " + a);
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
3、逻辑运算符
逻辑与:&
	true & true 结果是true
	true & false 结果是false
	false & true 结果是false
	false & false 结果是false
	
	只有两个边都是true,结果才为true。

逻辑或:|
	true | true 结果是true
	true | false 结果是true
	false | true 结果是true
	false | false 结果是false
	
	只要有一边是true,结果就为true。
	
逻辑非:!
	!true  变为false
	!false 变为true
	
逻辑异或:^
	true | true 结果是false
	true | false 结果是true
	false | true 结果是true
	false | false 结果是false
	
	只有两边不一样,一个是true,一个是false,结果才为true。
	
短路与:&&
	true && true 结果是true
	true && false 结果是false
	false && ? 结果是false
	false && ? 结果是false
	
	只有两个边都是true,结果才为true。
	但是它如果左边已经是false,右边不看。这样的好处就是可以提高效率。

	
短路或:||
	true || ? 结果是true
	true || ? 结果是true
	false || true 结果是true
	false || false 结果是false
	
	只要有一边是true,结果就为true。
	但是它如果左边已经是true,右边就不看了。这样的好处就是可以提高效率。

特殊:
(1)逻辑运算符的操作数必须是boolean值
(2)逻辑运算符的结果也是boolean值

*/
public class LogicOperator{
	public static void main(String[] args){
		/*
		表示条件,成绩必须在[0,100]之间
		成绩是int类型变量score
		*/
		int score = 56;
		
		//System.out.println(0<=score<=100);
		/*
		LogicOperator.java:23: 错误: 二元运算符 '<=' 的操作数类型错误
                System.out.println(0<=score<=100);
                                           ^
		  第一个类型:  boolean    0<=score的结果 true
		  第二个类型: int
		  
		  true <= 100?不对的
		1 个错误*/
		
		System.out.println(0<=score  & score<=100);
		
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

# 4. 条件运算符

  • 条件运算符格式:
条件表达式?结果1:结果2
1
  • 条件运算符计算方式:
    • 条件判断的结果是true,条件运算符整体结果为结果1,赋值给变量。
    • 判断条件的结果是false,条件运算符整体结果为结果2,赋值给变量。
public static void main(String[] args) {
    int i = (1==2 ? 100 : 200);
    System.out.println(i);//200
    int j = (3<=4 ? 500 : 600);
    System.out.println(j);//500
}
1
2
3
4
5
6
public class ConditionOperator{
	public static void main(String[] args){
		//判断两个变量a,b谁大,把大的变量赋值给max
		int a = 2;
		int b = 2;
		int max = a >= b ? a : b;
		//如果a>=b成立,就取a的值赋给max,否则取b的值赋给max
		System.out.println(max);
		
		boolean marry = false;
		System.out.println(marry ? "已婚" : "未婚"  );
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 5. 位运算符

位运算符 符号解释
& 按位与,当两位相同时为1时才返回1
| 按位或,只要有一位为1即可返回1
~ 按位非,将操作数的每个位(包括符号位)全部取反
^ 按位异或。当两位相同时返回0,不同时返回1
<< 左移运算符
>> 右移运算符
>>> 无符号右移运算符
  • 位运算符的运算过程都是基于补码运算,但是看结果,我们得换成原码,再换成十进制看结果
  • 从二进制到十进制都是基于原码
  • 正数的原码反码补码都一样,负数原码反码补码不一样
  • byte,short,char在计算时按照int类型处理

如何区分&,|,^是逻辑运算符还是位运算符?

如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就位运算符。

# (1)左移:<<

​ 运算规则:左移几位就相当于乘以2的几次方

​ 注意: 当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位

​ byte,short,char在计算时按照int类型处理

3<<4  类似于  3*2的4次= 3*16 = 48
1

image-20200225113651675

-3<<4  类似于  -3*2的4次= -3*16 = -48
1

image-20200225114707524

# (2)右移:>>

快速运算:类似于除以2的n次,如果不能整除,向下取整

69>>4  类似于  69/2的4次 = 69/16 =4
1

image-20200225115636844

-69>>4  类似于  -69/2的4次 = -69/16 = -5
1

image-20200225120112188

# (3)无符号右移:>>>

运算规则:往右移动后,左边空出来的位直接补0,不看符号位

正数:和右移一样

负数:右边移出去几位,左边补几个0,结果变为正数

69>>>4  类似于  69/2的4次 = 69/16 =4
1

image-20200225121104734

-69>>>4   结果:268435451
1

image-20200225121244290

# (4)按位与:&

运算规则:对应位都是1才为1

​ 1 & 1 结果为1

​ 1 & 0 结果为0

​ 0 & 1 结果为0

​ 0 & 0 结果为0

9&7 = 1
1

image-20200225122440953

-9&7 = 7
1

image-20200225122221616

# (5)按位或:|

运算规则:对应位只要有1即为1

​ 1 | 1 结果为1

​ 1 | 0 结果为1

​ 0 | 1 结果为1

​ 0 & 0 结果为0

9|7  结果: 15
1

image-20200225122758851

-9|7 结果: -9
1

image-20200225123409130

# (6)按位异或:^

​ 运算规则:对应位一个为1一个为0,才为1

​ 1 ^ 1 结果为0

​ 1 ^ 0 结果为1

​ 0 ^ 1 结果为1

​ 0 ^ 0 结果为0

9^7  结果为14
1

image-20200225123445305

-9^7 结果为-16
1

image-20200225133145727

# (7)按位取反:~

运算规则:~0就是1

​ ~1就是0

~9  结果:-10
1

image-20200225124112662

~-9  结果:8
1

image-20200225124156862

# 6. 赋值运算符

运算符 符号解释
= 将右边的常量值/变量值/表达式的值,赋值给左边的变量
+= 将左边变量的值和右边的常量值/变量值/表达式的值进行相加,最后将结果赋值给左边的变量
-= 将左边变量的值和右边的常量值/变量值/表达式的值进行相减,最后将结果赋值给左边的变量
*= 将左边变量的值和右边的常量值/变量值/表达式的值进行相乘,最后将结果赋值给左边的变量
/= 将左边变量的值和右边的常量值/变量值/表达式的值进行相除,最后将结果赋值给左边的变量
%= 将左边变量的值和右边的常量值/变量值/表达式的值进行相模,最后将结果赋值给左边的变量
<<= 将左边变量的值左移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量
>>= 将左边变量的值右移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量
>>>= 将左边变量的值无符号右移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量
&= 将左边变量的值和右边的常量值/变量值/表达式的值进行按位与,最后将结果赋值给左边的变量
|= 将左边变量的值和右边的常量值/变量值/表达式的值进行按位或,最后将结果赋值给左边的变量
^= 将左边变量的值和右边的常量值/变量值/表达式的值进行按位异或,最后将结果赋值给左边的变量
public class OperatorDemo04 {
	public static void main(String[] args) {
		int a = 3;
		int b = 4;
        int c = a + b;        
        
		b += a;// 相当于 b = b + a ; 
		System.out.println(a); // 3
		System.out.println(b); // 7	
        System.out.println(c); //7
		
		short s = 3;
		// s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度
		s += 4; // 代码没有报错
        //因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成short
		System.out.println(s);
        
        int j = 1;
		j += ++j * j++;//相当于  j = j + (++j * j++);
		System.out.println(j);//5
        
        int m = 1;
        m <<= 2;
        System.out.println(m);
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  • 扩展赋值运算符在将最后的结果赋值给左边的变量前,多做了一步强制类型转换。
  • 注意:所有的赋值运算符的=左边一定是一个变量

# 7. 运算符优先级

1553858424335

提示说明:

(1)表达式不要太复杂

(2)先算的使用()

口诀:

单目运算排第一;

乘除余二加减三;

移位四,关系五;

等和不等排第六;

位与、异或和位或;

短路与和短路或;

依次从七到十一;

条件排在第十二;

赋值一定是最后;

# 8. 标点符号

在Java中一共有12个标点符号。(后面再一一学习)

image-20210701170438577

  • 小括号 () 用于强制类型转换、表示优先运算表达式、方法参数列表
  • 大括号 {} 用于数组元素列表、类体、方法体、复合语句代码块边界符
  • 中括号 [] 用于数组
  • 分号; 用于结束语句
  • 逗号,用于多个赋值表达式的分隔符和方法参数列表分隔符
  • 英文句号.用于成员访问和包目录结构分隔符
  • 英文省略号...用于可变参数
  • @用于注解
  • 双冒号::用于方法引用

各个标点符号的使用在后续章节中一一揭晓。

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是scholar,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于scholar (opens new window) (opens new window),可以关注公众号-书生带你学编程,后面文章会首先同步至公众号。

公众号封面

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Java进制和存储
Java流程控制

← Java进制和存储 Java流程控制→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式