目录
关系(比较)运算符
比较运算符 | 说明 | 范例 | 结果 |
== | 相等于 | 4 == 3 | false |
!= | 不等于 | 4 != 3 | true |
< | 小于 | 4 < 3 | false |
> | 大于 | 4 > 3 | true |
<= | 小于等于 | 4 <= 3 | false |
>= | 大于等于 | 4 >= 3 | true |
instanceof | 检查是否是类的对象 | “hello” instanceof String | true |
- 比较运算符的结果都是boolean类型的,也就是要么是true,要么是false
- 比较运算符”==”不能误写成”=”
逻辑运算符
- 逻辑与:& 逻辑或:| 逻辑非:! 逻辑异或:^
- 短路与:&& 短路或:||
a | b | a&b | a&&b | a|b | a||b | !a | a^b |
true | true | true | true | true | true | false | false |
true | false | false | false | true | true | false | true |
false | true | false | false | true | true | true | true |
false | false | false | false | false | false | true | false |
规律:
- 与:两边都是true时结果才是true
- 或:两边有一个是true时结果就是true
- 非:就是取反
- 异或:两边相同时结果是false,不同时结果是true
&和&&的区别:
-
相同点:
-
运算结果都相同
-
左边是true时,都会执行右边的表达式
-
-
不同点:
- 当左边是false时,&会继续执行右边的表达式,而&&则不会执行右边的表达式
开发中推荐使用&&。
|和||的区别:
-
相同点:
- |和||的结果相同
- 相同点2:当左边的结果是false时,|和||都会执行右边的表达式
-
不同点:
- 当左边的结果是true时,|会执行右边的表达式,而||不会执行右边的表达式
开发中推荐使用||。
class LogicTest{
public static void main(String[] args){
boolean b1 = true;
int num1 = 5;
if(b1 | (num1++ > 0)){
System.out.println("张三");
}
System.out.println(num1);
boolean b2 = true;
int num2 = 5;
if(b2 || (num2++ > 0)){
System.out.println("李四");
}
System.out.println(num2);
}
程序流程控制
- 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块
- 流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:
- 顺序结构
- 程序从上到下逐行地执行,中间没有任何判断和跳转
- 分支(选择)结构
- 根据条件,选择性地执行某段代码
- 有if-else和switch-case两种分支语句
- 循环结构
- 根据循环条件,重复性的执行某段代码
- 有while、do-while、和for三种循环语句
- 注:JDK5提供了foreach循环,方便遍历集合、数组元素
选择(分支)结构
if结构
if(条件表达式){
执行代码块;
}
if-else结构
if(条件表达式){
执行代码块1;
}else{
执行代码块2;
}
流程图:
- 菱形:用来做判断的
- 矩形:普通的要执行的代码
- 圆圈:表示结束
- 开始:由一个小的矩形表示
多重if-else结构
if(条件表达式1){
执行代码块1;
}
else if(条件表达式2){
执行代码块2;
}
...
else{
执行代码块n;
}
Scanner的使用
案例:
/*
Scanner可以用来从键盘获取数据
具体实现步骤:
1. 导包:import java.util.Scanner
2. Scanner的实例化:Scanner scan = new Scanner(System.in);
3. 调用Scanner类的相关方法,来获取指定类型的数据
*/
import java.util.Scanner;
class ScannerTest{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
System.out.println(num);
System.out.println("请输入你的姓名:");
String name = scan.next();
System.out.println(name);
System.out.println("请输入你的年龄:");
int age = scan.nextInt();
System.out.println(age);
System.out.println("请输入你的工资:");
double salary = scan.nextDouble();
System.out.println(salary);
System.out.println("请问你是否结婚:(true/false)");
boolean isMarried = scan.nextBoolean();
System.out.println(isMarried);
}
}
选择结构-switch-case
格式如下:
switch(表达式){
case 常量1:
语句1;
//break;
case 常量2:
语句2;
//break;
case 常量n;
语句n;
//break;
default:
语句;
//break;
}
说明:
/*
1. 根据switch表达式中的值,依次匹配各个case中的常量。
一旦匹配成功,则进入相应的case结构中,调用其执行语句;
当调用完执行语句后,则仍然继续向下执行其他的case结构中的语句,
直到遇到break关键字或者switch-case语句末尾结束为止。
2. break关键字,可以使用在switch-case结构中,表示一旦执行到此关键字,
就跳出switch-case结构。
3. switch结构中的表达式,只能是如下的6种数据类型之一:
byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
4. case后面只能声明常量,不能是一个范围
5. break关键字是可选的
6. default:相当于if-else中的else
default是可选的,位置是灵活的
*/
三元运算符
- 格式:(条件表达式)?表达式1:表达式2;
说明:条件表达式为true,运算后的结果是表达式1;否则是表达式2.
- 表达式1和表达式2为一致的类型
- 三元运算符与if-else的联系与区别:
- 三元运算符可以简化if-else语句
- 三元运算符要求必须返回一个结果
- if后的代码块可以有多个语句
- 三元运算符可以嵌套使用
案例:
class SanYuanTest{
public static void main(String[] args){
//获取两个数的最大值
int m = 15;
int n = 10;
int max = (m > n) ? m : n;
System.out.println("最大值是:" + max);
//(m > n) ? m : "n比较大";//两个表达式的类型不一致,没法接收结果
String maxStr = (m > n) ? "m大" : ((m == n) ? "m和n相等" : "n比较大");
System.out.println(maxStr);
//获取三个数的最大值
int m1 = 12;
int m2 = 25;
int m3 = -16;
int max1 = (m1 > m2) ? m1 : m2;
int max2 = (max1 > m3) ? max1 : m3;
System.out.println("三个数的最大值是:" + max2);
}
}
三元运算符与if-else的转换
- 凡是使用三元运算符的地方,都可以改写为if-else;反之,不成立。if-else中可以写的比较复杂,而三元运算符只是个简单的运算符。(比如上面案例中类型不一致的情况,就可以用if-else搞定)
- 如果一段程序既可以使用三元运算符又可以使用if-else,推荐使用三元运算符。原因:三元运算符简单、执行效率高。
运算符的优先级
- 运算符有不同的优先级,所谓的优先级就是表达式运算中的运算顺序。
- 只有单目运算符、三元运算符、赋值运算符是从右向左运算的。
- 运算符优先级是有一张表的,不推荐大家死记。简单来说,大家在写代码的过程中,如果想要某个表达式优先计算,加个小括号就可以了。
进制(了解)
概述
- 所有数字在计算机底层都以二进制的形式存在
- 对于整数,有四种表示方式:
- 二进制(binary):0,1,满2进1.以0b或0B开头
- 十进制(decimal):0-9,满10进1
- 八进制(octal):0-7,满8进1.以数字0开头表示
- 十六进制(hex):0-9及A-F,满16进1.以0x或0X开头表示。此处的A-F不区分大小写
public class Demo2 {
public static void main(String[] args) {
int num1 = 0b10; //二进制
int num2 = 10; //十进制
int num3 = 010; //八进制
int num4 = 0x10; //十六进制
//输出之后,都是以十进制来显示数据
System.out.println("num1:" + num1);
System.out.println("num2:" + num2);
System.out.println("num3:" + num3);
System.out.println("num4:" + num4);
}
}
原码反码补码
在二进制中怎样表示正数和负数呢?
我们将最高位作为符号位,最高位是0,表示正数,最高位是1,表示负数。
二进制的整数有三种形式:原码、反码和补码。
- 原码:直接将一个数值转换成二进制数。最高位是符号位。
- 正数的原码、反码、补码都相同
- 负数的反码:是对其原码按位取反,只是最高位(符号位)确定为1.
- 负数的补码:其反码加1.
- 计算机是以二进制补码的形式保存所有的整数。
总结:
- 二进制整数有三种表示形式:原码、反码和补码
- 计算机中是以补码的方式来存储数据的
- 正数的原码和补码相同
- 负数的补码需要经过反码来进行计算(先将该负数对应的正数用二进制表示出来,然后将最高位变为1,然后对其它各个位取反得到反码,然后反码加1就会得到补码,那这个补码就是该负数在计算机中的存储形式。)
- 当给定一个二进制的负数的时候,如果没有明确说明,那这个给定的负数指的是某个数的补码。我们可以推算出它到底表示的是几。(是一个逆过程,将该补码减一得到反码,然后对除符号位外各个位取反得到原码,那这个原码就是该负数所表示的实际的数字)
进制转换
十进制转二进制:
将十进制的数不断的的除以2,得到各个余数,然后将余数倒着写回去即是转为的二进制表示形式。
二进制转十进制:
从左边第一位数乘以2的n-1次方(幂),n代表该数字从右到左数起的位数。
比如:二进制的数 1010,转十进制的时候这么计算:1*2^3 + 0 *2^2 + 1*2^1 + 0*2^0 = 10
位运算符
位运算符 | 描述 | 范例 |
& | 与运算 | 6 & 3 = 2 |
| | 或运算 | 6 | 3 = 7 |
^ | 异或运算 | 6 ^ 3 = 5 |
~ | 取反运算 | ~6 = -7 |
移位运算符
移位算符 | 描述 | 范例 |
<< | 左移,每左移1位就相当于在原来的基础上乘以2 | 3 << 2 = 12 |
>> | 右移,每右移1位就相当于在原来的基础上除以2 右移之后,空出来的位用0补,但是最高位之前是多少,就还是多少。 | 3 >> 1 = 1 |
>>> | 无符号右移,不论最高位是几,空出来的位都是拿0来补 | 3 >>> 1 = 1 |
枚举
枚举的意思就是有限个、确定的东西。
比如,一周的天数就是枚举,周一、周二。。。周日
比如,性别也是枚举,男、女
比如,一年的下雨量,就不能是枚举了,因为不确定么。
Java中定义枚举用的关键字是enum。