1. 显示当前时间
a). 调用System.currentTimeMillis()方法获取存放在变量totalMilliseconds中从1970年1月1日午夜到现在的毫秒数(例如:1203183086328毫秒)。
b). 通过将总毫秒数totalMilliseconds除以1000得到总秒数totalSeconds(例如:1203183086328毫秒/1000 = 1203183086秒)。
c). 通过totalSeconds%60得到当前的秒数(例如:1203183086秒%60 = 26,这个值就是当前秒数)。
d). 通过将totalSeconds除以60得到总的分钟数totalMinutes(例如:1203183086秒/60 = 20053051分钟)。
e). 通过totalMinutes%60得到当前分钟数(例如:20053051分钟%60 = 31,这个值就是当前分钟数)。
f). 通过将总分钟数totalMinutes除以60获得总的小时数totalHours(例如:20053051分钟/60 = 334217小时)。
g). 通过totalHours%24得到当前的小时数(例如:334217小时%24 = 17,该值就是当前小时数)。
2. 算术运算符:+,-,*,/,%,++,--
a). +的用法: a:加法 b:正号 c:字符串连接符
System.out.println("hello"+'a'+1); helloa1
System.out.println('a'+1+"hello"); 98hello
b). /和%的区别: 数据做除法操作的时候,/取得是商,%取得是余数
int x = 3, y = 4; System.out.println(x + y); // 7 System.out.println(x - y); // -1 System.out.println(x * y); // 12 System.out.println(x / y); // 0 System.out.println(x * 1.0 / y); // 0.75 System.out.println(x % y); // 3
c). 算术运算结果的类型:
1. 当参与运算的元素类型相同时,结果的类型一定与运算元素的类型一致。
2. 当参与运算的元素类型不同时,结果的类型一定与运算中类型大的元素类型一致。
short s = 1; //值在类型的取值范围内时,JVM会自动将值转换为需要的类型 s = s + 1; //错误,结果的类型为int类型,不能直接赋给short. s += 1; //正确,+=会自动转换结果的类型
d). ++/--可以出现在变量的前面/后面。
e). 无论出现在前面/后面,代码执行后变量一定加1/减1
f). ++/--出现在前面:先参与计算,再取值。
g). ++/--出现在后面:先取值,再参与计算。
int y = (x++)+(++x)+(x*10); //4+6+60
//交换两个变量的值(不通过第三个变量实现) x = x + y; y = x - y; x = x - y;
3. 比较运算符:>,>=,<,<=,==,!=。
a). 比较运算的结果一定为boolean类型。
b). JAVA中不是所有的类型都可以使用比较运算符进行比较。如:boolean与其它类型。基本数据类型不能与引用数据类型进行比较。
4. 逻辑运算符:&,|,!,&&,||,^
a). 逻辑与(&),逻辑或(|)
b). 短路与(&&,当第一个表达式为false时,不执行第二个表达式,直接返回false),短路或(||,当第一个表达式为true时,不执行第二个表达式,直接返回true)
c). 逻辑非:!,取反
d). 异或^:相同则false,不同则true。
5. 扩展运算符:+=,-=,*=,/=,%=,扩展运算符会自动转换结果的类型
short s = 1; s += 1; //正确,+=会自动转换结果的类型 //不是等价于 s = s + 1; 而是等价于 s = (s的数据类型)(s + 1);
6. 位运算符:&,|,^,~,<<,>>,>>>
A: 异或(^)的特殊用法:一个数据针对另一个数据位异或两次,该数不变
注意:要做位运算,首先要把数据转换为二进制。
// &,|,^,~ int a = 3; int b = 4; System.out.println(3 & 4); System.out.println(3 | 4); System.out.println(3 ^ 4); System.out.println(~3); /* 分析:因为是位运算,所以我们必须先把数据换算成二进制。 3的二进制:11 00000000 00000000 00000000 00000011 4的二进制:100 00000000 00000000 00000000 00000100 &位与运算:有0则0。 00000000 00000000 00000000 00000011 &00000000 00000000 00000000 00000100 ----------------------------------- 00000000 00000000 00000000 00000000 结果是:0 |位或运算:有1则1。 00000000 00000000 00000000 00000011 |00000000 00000000 00000000 00000100 ----------------------------------- 00000000 00000000 00000000 00000111 结果是:7 ^位异或运算:相同则0,不同则1。 00000000 00000000 00000000 00000011 ^00000000 00000000 00000000 00000100 ----------------------------------- 00000000 00000000 00000000 00000111 结果是:7 ~按位取反运算符:0变1,1变0 00000000 00000000 00000000 00000011 ~11111111 11111111 11111111 11111100 (补码) 补码:11111111 11111111 11111111 11111100 反码:11111111 11111111 11111111 11111011 原码:10000000 00000000 00000000 00000100 结果是:-4 */
**一个数据针对另一个数据位异或两次,该数不变**
int a = 10; int b = 20; System.out.println(a ^ b ^ b); //10 System.out.println(a ^ b ^ a); //20
B: 左移(<<) 左边最高位丢弃,右边补齐0
右移(>>) 右边数值位丢弃,最高位是0,左边补齐0;最高为是1,左边补齐1
无符号右移(>>>) 右边数值位丢弃,无论最高位是0还是1,左边补齐0
面试题:
a:请实现两个变量的交换
int a = 10;
int b = 20;
**方式1:采用第三方变量
int c = a; a = b; b = c; System.out.println("a:"+a+",b:"+b);
**方式2:用位异或运算符(面试用)
//左边a,b,a //右边a^b a = a ^ b; b = a ^ b; //a ^ b ^ b = a a = a ^ b; //a ^ b ^ a = b System.out.println("a:"+a+",b:"+b);
**方式3:用变量相加的做法
a = a + b; //a=30 b = a - b; //b=10 a = a - b; //a=20 System.out.println("a:"+a+",b:"+b);
**方式4:一句话搞定
b = (a+b) - (a=b); //b=30-20=10,a=20 System.out.println("a:"+a+",b:"+b);
b:请用最有效率的方式计算出2乘以8的结果
2<<3
// <<,把<<左边的数据乘以2的移动次幂 System.out.println(3 << 2); // 3*2^2 = 3*4 = 12; // >>,把>>左边的数据除以2的移动次幂 System.out.println(24 >> 2); // 24/2^2 = 24/4 = 6 System.out.println(24 >>> 2); // 6 System.out.println(-24 >> 2); // -6 System.out.println(-24 >>> 2); // 1073741818 System.out.println(0b00111111111111111111111111111010); // 1073741818 /* 计算出3的二进制:11 00000000 00000000 00000000 00000011 (00)000000 00000000 00000000 0000001100 ---------------------------------------------- 计算出-24的二进制 原码:10000000 00000000 00000000 00011000 >> 2的移动: 原码:10000000 00000000 00000000 00011000 反码:11111111 11111111 11111111 11100111 补码:11111111 11111111 11111111 11101000 11111111 11111111 11111111 11101000 1111111111 11111111 11111111 111010(00) 补码 补码:1111111111 11111111 11111111 111010 反码:1111111111 11111111 11111111 111001 原码:1000000000 00000000 00000000 000110 结果:-6 >>> 2的移动: 原码:10000000 00000000 00000000 00011000 反码:11111111 11111111 11111111 11100111 补码:11111111 11111111 11111111 11101000 11111111 11111111 11111111 11101000 0011111111 11111111 11111111 111010(00) 结果:1073741818 ---------------------------------------------- */
7. 三元运算符(三目运算符):x ? y : z ;x是一个boolean类型。当x为true时,返回y的值。当x为false时,返回z的值。
int z = ((x = y)? x : y); // 报错,这是赋值符号。
获取三个整数中的最大值
int a = 10,b = 30,c = 20;
int max2 = (a > b)?((a > c)? a: c):((b > c)? b: c);
int max2 = a > b?a > c? a: c:b > c? b: c; // 这种做法不推荐。
int i,j,k; i=j=k=1; // 该语句正确