1、运算符
算术运算符
-
需要注意的运算符
-
除 /
System.out.println(10 / 4); //结果:2 因为10、4都是整数,所以结果为整数 double d = 10 / 4; //结果:2.0 因为d为double型,所以结果为浮点型 System.out.println(10.0 / 4); //结果:2.5
-
取模 %
两个数取模的本质为,a % b = a - a / b * b
//取模的本质为 a % b = a - a / b * b System.out.println(10 % 3); //结果 :1 System.out.println(-10 % 3); //结果 :-1 System.out.println(10 % -3); //结果 :1 System.out.println(-10 % -3); //结果 :-1
-
自增/自减 ++/–
- 前缀:i++ / i-- ,在表达式中先赋值后自增自减
- 后缀:++i / --i,在表达式中先自增自减后赋值
他们都表示自增或自减
int i = 1; int j = 1; int a = i++; //先赋值,后做自增运算 int b = ++j; //先做自增运算,后赋值 System.out.println(a + "," + b); //结果:a=1 ,b=2
-
关系运算符
-
关系运算符的运算结果都是boolean型 true or false,例如 12 > 11的值为true
-
"==“表示做等值比较,”="表示赋值,一定要区分
逻辑运算符
-
短路与 && 和 逻辑与 &
-
相同点
左右两边都为true,才输出true,否则返回false
-
不同点
-
对于短路与 && ,如果前面为false,则后面不会执行
int a = 1; int b = 2; if(a < 1 && ++b > 1){ System.out.println("ok"); } System.out.println(b); //输出b还是2 ,不会执行++b操作
-
对于逻辑& ,如果前面为false,后面还是会继续执行
int a = 1; int b = 2; if(a < 1 & ++b > 1){ System.out.println("ok"); } System.out.println(b); //输出b是3 ,会执行++b操作
-
-
所以我们会常用短路与&& ,效率高
-
-
短路或 || 和 逻辑或 |
-
相同点
只要有一边为true,则返回true,只有都为false的时候才返回false
-
不同点
- 对于短路或 || ,如果前面为true,则后面不会执行
- 对于逻辑 | ,如果前面为true,后面还是会继续执行
-
-
取反 !
-
真为假,假为真
System.out.println(!(60 > 0)); //返回true
-
-
异或
- 都为true或者都为false时,返回false;一真一假为true
赋值运算符 =
-
+= 表示的含义 ,比如 a+=b; 等价于 a = a + b;
-
复合赋值运算时会有一个类型的强制转换,例如
byte b = 1; b+=2; //等价于 b = (byte)(b + 2); 因为2默认是int型 b++; //等价于 b = (byte)(b + 1);
三元运算符
-
条件表达式 ? 表达式1 : 表达式2;
- 条件表达式为真 ,返回表达式1;否则返回表达式2
-
注意:
-
三元运算符的返回值,也就是表达式1或者表达式2,必须要与接受的类型相匹配
int c = 1 > 2 ? 3 : 4; //3,4 都为int型 int c = 1 > 2 ? 1.1 : 1.2; //错误 :结果为double型,接收的类型为int
-
三元运算符的本质其实就是一条if…else… 语句
//a > b ? a : b; if(a > b){ result = a; }else{ result = b; }
-
-
案例:求三个数中最大值
//三元运算符 public class TernaryOperator { public static void main(String[] args) { //比较三个数中最大的 int a = 1; int b = 2; int c = 3; int max = (a > b ? a : b) > c ? (a > b ? a : b) : c ; System.out.println(max); } }
运算符优先级
- 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符
2、进制转换
- 进制
- 二进制:0和1,逢二进一,以0b或者0B开头表示二进制
- 八进制:0-7,逢八进一,以0开头表示八进制
- 十进制:0-9,逢十进一
- 十六进制:0-9和A-F,逢十六进一,以0X或0x开头表示十六进制
转十进制
-
二进制转十进制
-
从最低位到最高位依次取出数,乘以2的位数减1次方,求和
例:二进制数1111 转十进制 0b1111 = (1 * 2^0) + (1 * 2^1) + (1 * 2^2) + (1 * 2^3) = 1 + 2 + 4 +8 = 15 例2:二进制数0b110001100 转十进制 0b110001100 = 1 * 2^2 + 1 * 2^3 + 1 * 2^7 + 1 * 2^8 = 4 + 8 + 128 + 256 = 396
-
-
八进制转十进制
-
从最低位到最高位依次取出数,乘以8的位数减1次方,求和
例:八进制数0234 转十进制 0234 = (4 * 8^0) + (3 * 8^1) + (2 * 8^2) = 4 + 24 + 128 = 156 例2:八进制数02456 转十进制 02456 = 6 * 8^0 + 5 * 8^1 + 4 * 8^2 + 2 * 8^3 = 1280
-
-
十六进制转十进制
-
从最低位到最高位依次取出数,乘以16的位数减1次方,求和
例:将0x23A转成十进制 0x23A = (10 * 16^0) + (3 * 16^1) + (2 * 16^2) = 10 + 48 + 512 = 570 例2:十六进制数0xA45转十进制 0xA45 = 5 * 16^0 + 4 * 16^1 + 9 * 16^2 = 2373
-
十进制转其他进制
- 十进制转二进制
- 将十进制数不断除以二,直到商为零,将每次得到的余数倒过来就是对应的二进制
- 十进制转八进制
- 将十进制数不断除以八,直到商为零,将每次得到的余数倒过来就是对应的八进制
- 十进制转十六进制
- 将十进制数不断除以十六,直到商为零,将每次得到的余数倒过来就是对应的十六进制
二进制转八进制、十六进制
-
转八进制
- 从低位开始,将二进制的每三位数当成八进制的一位数,并转为对应的八进制数
例:0b1101101 -> 1 101 101 -> 0155
-
转十六进制
- 从低位开始,将二进制的每四位数当成十六进制的一位数,并转为对应的十六进制数
例:0b11010101 -> 0x 1101 0101 -> 0xD5
八进制、十六进制转二进制
- 八进制转二进制
- 将八进制的每一位数,转成一个三位的二进制数
- 十六进制转二进制
- 将十六进制的每一位数,转成一个四位的二进制数
3、位运算
原码、反码、补码注意事项
- 二进制最高位是符号位,0表示正数,1表示负数
- 正数的原码反码补码都是一样
- 负数的反码==符号位不变,其他位数取反(0->1,1->0)
- 负数的补码它的反码 + 1,反码它的补码 - 1
- 0的反码和补码都为0
- Java中的数都是有符号的
- 计算机运算是以补码的方式来运算的
- 运算结果看原码
Java中有七个位运算符:&、I、^、~、<<、>>和>>>
- 按位运算:
- 按位与&: 两位全为1,结果为1,否则为0
- 按位或| :两位有一个为1,结果为1,否则为0
- 按位异或^: 两位一个为0,一个为1,结果为1,否则为0
- 按位取反~:: 0->1,1->0
-
移位运算 <<、>>和>>>
- 算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
- 算术左移<<:符号位不变,低位补0
- 逻辑右移>>>:也叫无符号右移运算规则是:低位溢出,高位补0。特别说明:没有<<<符号
4、标识符、关键字、保留字
标识符的命名规则而规范
- 规则
- 必须由字母、数字、_ 、$ 组成
- 不能以数字开头
- 不能使用关键字或保留字重复
- 严格区分大小写,长度理论上没有限制。作用域内不能重复
- 不能包含空格
- 规范
- 包名小写,用点隔开 ,比如com.wjw
- 类名、接口:大驼峰命名规则,单词首字母大写 Student
- 变量名和方法名 : 小驼峰命名规则,第一个单词首字母小写,其余单词首字母大写 ,比如 runStart()
- 常量名:所有字母大写,用_隔开,比如 STUDENT_AGE
关键字
- 被Java赋予含义的字符串,全部小写
保留字
不能包含空格
- 规范
- 包名小写,用点隔开 ,比如com.wjw
- 类名、接口:大驼峰命名规则,单词首字母大写 Student
- 变量名和方法名 : 小驼峰命名规则,第一个单词首字母小写,其余单词首字母大写 ,比如 runStart()
- 常量名:所有字母大写,用_隔开,比如 STUDENT_AGE