该文章Github地址:https://github.com/AntonyCheng/java-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】
在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】& CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!
上一章:由浅到深认识Java语言(4):数据类型
11.Java中的运算符
算术运算符
符号 | 意义 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 取整 |
% | 取余 |
++ | 累加 |
-- | 类减 |
-
取整/取余
注意
double
类型和float
类型取整取余的计算;package top.sharehome.Bag; public class Demo { public static void main(String[] args) { double a = 12.99; float b = 12.99f; double DF1 = b / 2; double DF2 = b % 2; float FF1 = b / 2; float FF2 = b % 2; double DD1 = a / 2; double DD2 = a % 2; float FD1 = (float) a / 2; // 这里要强转 float FD2 = (float) a % 2; // 这里要强转 double DI = 12 / 5; float FI = 12 / 5; System.out.println("DtoF1=" + DF1); System.out.println("DtoF2=" + DF2); System.out.println("FtoF1=" + FF1); System.out.println("FtoF2=" + FF2); System.out.println("DtoD1=" + DD1); System.out.println("DtoD2=" + DD2); System.out.println("FtoD1=" + FD1); System.out.println("FtoD2=" + FD2); System.out.println("DtoI=" + DI); System.out.println("FtoI=" + FI); } }
打印效果如下
如果想要
double
的结果,就需要在参与运算的一方变成double
即可:double a = (double)12/5;
这样整个结果就是一个
double
; -
加法
特殊用法:字符串的连接符;
注意:
- 当基本数据类型和字符串之间使用
+
作运算符,此时该+
是字符串连接符,当运算中含有整数时,+
后面不能接字符,否则是做ASCII值的加法运算; - 运算时还要注意计算的顺序,要想清楚是先计算还是先转码:
- 当基本数据类型和字符串之间使用
-
++
/--
自增/自减首先得牢记的是,赋值也是一种运算;
package top.sharehome.Bag; public class Demo { public static void main(String[] args) { int i = 10; int b = i++; //先赋值10,再加得i=11 int c = ++i; //先加得i=12,再赋值12 System.out.println(b); System.out.println(c); } }
打印效果如下:
记忆:看谁离等号近,就先运算谁;
建议在表达式中不要使用++或者–,这样的代码会让人困惑,而且可能会带来烦人的bug,主要原因参考《Java核心技术 卷Ⅰ》
赋值运算符
-
=
赋值运算符int a = 10;
-
+=
加等运算符int a = 10; a += 10; //等同于 a = a + 10 == 20
-
+=
减等运算符int a = 10; a -= 10; //等同于 a = a - 10 == 0
-
笔试题:
//判断下列式子是否会报错? short a = 10; a = a + 1; //会报错 a += 1; //不会报错 a++; //不会报错
关系运算符
关系运算会产生 boolean
的结果: true
false
符号 | 意义 |
---|---|
> | 大于 |
< | 小于 |
== | 等于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
逻辑运算符
关系运算会产生 boolean
的结果: true
false
;
逻辑运算是可以让多个关系运算组合在一起,生成相应的结果,因此参与逻辑运算的双方都应该是一个布尔值的表达式,即运算结果是一个 boolean
;
符号 | 意义 |
---|---|
& | 逻辑与 |
**` | `** |
^ | 逻辑异或 |
! | 逻辑非 |
&& | 短路与 |
**` |
-
逻辑与
&
T & T = T
T & F = F
F & F = F
-
逻辑或
|
T | F = T
T | T = T
F | F = F
-
逻辑异或
^
T ^ F = T
T ^ T = F
F ^ F = F
-
逻辑非
!
!T = F
!F = T
-
短路与
&&
短路与和逻辑与的运算规则是相同的,也就是两边都是
true
才是true
,只要有一边是false
,结果必然是false
;但是短路与可以大大提高程序的效率,因为只要左边是
false
,右边就不会再运算,因为结果必然是false
; -
短路或
||
短路或和逻辑或的运算规则是相同的,也就是两边都是
false
才是false
,只要有一边是true
,结果必然是true
;但是短路与可以大大提高程序的效率,因为只要左边是
true
,右边就不会再运算,因为结果必然是true
;
位运算符
当符号两边是整数时,则是位运算符;当符号两边是 boolean
,则是逻辑运算符;
-
&
按位与有 0 得 0,其他得 1;
6 & 2 0000 0110 & 0000 0010 ------------- 0000 0010 == 2
-
|
按位或有 1 得 1,其他得 0;
6 | 2 0000 0110 | 0000 0010 ------------- 0000 0110 == 6
-
^
按位异或1 ^ 1 == 0;
0 ^ 0 == 0;
1 ^ 0 == 1;
6 ^ 2 0000 0110 ^ 0000 0010 ------------- 0000 0100 == 4
-
~
按位取反按位取反会改变符号位:
~0 == 1;
~1 == 0;
~6 0000 0110 ------------- 1111 1001
-
>>
有符号右移实现二进制的右移;
6 >> 2 0000 0110 >> 2 == 0000 0001 == 1 //正数补 0 -7 >> 2 1111 1001 >> 2 == 1111 1110 == -2 //负数补 1
-
<<
有符号左移实现二进制的左移;
6 << 2 0000 0110 << 2 == 0001 1000 == 24
-
>>>
无符号右移正负号均补 0;
6 >>> 2 0000 0110 >>> 2 == 0001 1000 == 24 -7 >>> 2 1111 1001 >>> 2 == 0011 1110 == 62
-
面试题:
如何最快的求得 8 × 2 3 8×2^3 8×23 ?
8 << 3 0000 1000 << 3 == 0100 0000 == 64
三元运算符
格式如下:
int a = 10;
int b = 20;
int m = a>b? a:b;
问号前面是条件表达式,条件为 true
则赋值 a
,否则赋值 b
;
示例如下:
用三元运算符比较三个数得大小:
package top.sharehome.Bag;
import java.util.Scanner; //从键盘获取,下一节内容
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //键盘获取,下一节内容
int a,b,c;
a = sc.nextInt(); //键盘获取,下一节内容
b = sc.nextInt(); //键盘获取,下一节内容
c = sc.nextInt(); //键盘获取,下一节内容
System.out.println(a>b? (a>c? a+"最大":c+"最大"):(b>c?b+"最大":c+"最大"));
sc.close();
}
}
打印效果如下:
运算符优先级
提示说明:
(1)表达式不要太复杂
(2)先算的使用()
大体的排序:算术 ⇒ 位 ⇒ 比较 ⇒ 逻辑 ⇒ 三元 ⇒ 赋值
12.从键盘获取输入
获取整数的固定格式:
//导入类
import java.util.Scanner;
class demo{
public static void main(String[] args){
//创建一个键盘输入对象
Scanner sc = new Scanner(System.in);
//调用方法获取
Scanner sc = new Scanner(System.in);
byte b = sc.nextByte();
char c = sc.next().charAt(0);
short s = sc.nextShort();
int i = sc.nextInt();
long l = sc.nextLong();
float f = sc.nextFloat();
double d = sc.nextDouble();
String s = sc.next();
//关闭键盘输入
sc.close();
}
}