Java初级基础之关于运算符的一些细节
【摘要】
一.关于++、–、算数运算符不改变数据类型
我们都知道在Java中byte、short、char 它们之间做数值计算的时候计算的结果都会变成int类型,如何把一个数值简单的去加一或减一结果还是原来的数据...
一.关于++、–、算数运算符不改变数据类型
我们都知道在Java中byte、short、char 它们之间做数值计算的时候计算的结果都会变成int类型,如何把一个数值简单的去加一或减一结果还是原来的数据类型呢,这个时候我们会用到++或–算数运算符,例子如下:
public static void main(String[] args) {
short s = 1;
//s = s + 1; //编译报错,在Java中byte、short、char 它们之间做数值计算的时候计算的结果都会变成int类型;
//传统方法,强制转换
s = (short)(s +1);
//++算数运算不改变原有变量的数据类型
s++;
--s;
System.out.println(s);
char c = 97;
System.out.println(c);
c++;
System.out.println(c);
}
输出结果:
2
a
b
Process finished with exit code 0
二.关于+=、-=、*=、/=、%= 、<<= 、>>=赋值运算符不改变数据类型
同上述一中所提到的,如果我们需要把某个变量的值在不改变自身数据类型的情况下加上其他的数值,我们应该如何去做呢,上面我们已经提到过了在Java中byte、short、char 它们之间做数值计算的时候计算的结果都会变成int类型,这个时候就需要用到我们的+=、-=等赋值运算符了。
关于+=、-=、*=、/=、%= 赋值运算符不改变数据类型例子如下:
public static void main(String[] args) {
char c = 97;
System.out.println(c);
//c = c +3; //编译报错
//传统方式
c = (char) (c + 3);
System.out.println(c);
//用-=赋值运算符
c -= 3;
System.out.println(c);
//用+=赋值运算符
c += 3;
System.out.println(c);
//用/=赋值运算符
c /= 2;
System.out.println(c);
//用*=赋值运算符
c *= 2;
System.out.println(c);
//用%=赋值运算符
c %= 52;
System.out.println(c);
}
输出结果:
a
d
a
d
2
d
0
Process finished with exit code 0
关于<<= 、>>=赋值运算符不改变数据类型例子如下:
byte b = 0b00000001;
System.out.println(b);
for (int i = 0; i < 9; i++) {
//b = b << 1;//编译报错,b<<1运算后其结果为int类型,
// 可以强制类型转换,写成b = (byte)(b << 1);
//<<= 、>>=赋值运算符不改变数据类型
b <<= 1;
System.out.println(b);
}
输出结果:
1
2
4
8
16
32
64
-128
0
0
Process finished with exit code 0
三.关于& 与 &&、| 与 || 逻辑运算符的区别
-
区分& 与 &&
相同点1:& 与 && 的运算结果相同
相同点2:当符号左边是true时,二者都会执行符号右边的运算
不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。
开发中,推荐使用&& -
区分:| 与 ||
相同点1:| 与 || 的运算结果相同
相同点2:当符号左边是false时,二者都会执行符号右边的运算
不同点3:当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算
开发中,推荐使用||
/**
* @Author: YuShiwen
* @Date: 2020/11/10 8:39 PM
* @Version: 1.0
*/
public class LogicTest {
public static boolean printNumber(int i){
System.out.println("第"+i+"次调用该静态方法");
return true;
}
public static void main(String[] args) {
//区分& 与 &&
//相同点1:& 与 && 的运算结果相同
//相同点2:当符号左边是true时,二者都会执行符号右边的运算
//不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。
//开发中,推荐使用&&
if(true & printNumber(1)){
}
if(true && printNumber(2)){
}
if(false & printNumber(3)){
}
if(false && printNumber(4)){
}
// 区分:| 与 ||
//相同点1:| 与 || 的运算结果相同
//相同点2:当符号左边是false时,二者都会执行符号右边的运算
//不同点3:当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算
//开发中,推荐使用||
if(false | printNumber(5)){
}
if(false || printNumber(6)){
}
if(true | printNumber(7)){
}
if(true || printNumber(8)){
}
}
}
输出结果
第1次调用该静态方法
第2次调用该静态方法
第3次调用该静态方法
第5次调用该静态方法
第6次调用该静态方法
第7次调用该静态方法
Process finished with exit code 0
四.关于<<、>>位运算符
- 位运算符操作的都是整型的数据
- << :在一定范围内,每向左移1位,相当于 * 2
>> :在一定范围内,每向右移1位,相当于 / 2
- 举例:
public static void main(String[] args) {
System.out.println(8 * 2);
System.out.println(8 << 1);
System.out.println(8 / 2);
System.out.println(8 >> 1);
System.out.println(8 / 4);
System.out.println(8 >> 2);
}
输出:
16
16
4
4
2
2
Process finished with exit code 0
- 运用:2*8、2<<3、8<<1 哪种方式效率比较高
public static void main(String[] args) {
int num = 0;
long startTime = System.currentTimeMillis();
for(int i = 0;i<100000;i++){
num = 2*8;
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
startTime = System.currentTimeMillis();
for(int i = 0;i<100000;i++) {
num = 2 << 3;
}
endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
startTime = System.currentTimeMillis();
for(int i = 0;i<100000;i++){
num = 8 << 1;
}
endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
第一次运行结果:
64
20
1
Process finished with exit code 0
第二次运行结果:
34
22
2
Process finished with exit code 0
第三次运行结果:
27
3
2
Process finished with exit code 0
可以看到28运算的速度是最慢的,2<<3速度比28快,8<<1最快。
五.三元运算符
-
结构:(条件表达式)? 表达式1 : 表达式2
-
说明
① 条件表达式的结果为boolean类型
② 根据条件表达式真或假,决定执行表达式1,还是表达式2.
如果表达式为true,则执行表达式1。
如果表达式为false,则执行表达式2。
③ 表达式1 和表达式2要求是一致的。
④ 三元运算符可以嵌套使用 -
凡是可以使用三元运算符的地方,都可以改写为if-else;反之,不成立。
-
如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。
public class TernaryOperator {
public static void main(String[] args) {
int m = 10;
int n = 20;
//一般使用举例
System.out.println((m > n ) ? m:n);
//编译报错
//表达式1 和表达式2要求是一致的
//String s = (m > n) ? 20:"hello";
//三元运算的嵌套使用:
int t = 30;
int max0 = (((m > n) ? m:n) > t) ? ((m > n) ? m:n):t; //不建议这样写,可读性太差
System.out.println(max0);
//建议如下写法
int max1 = (m > n) ? m : n;
int max2 = (max1 > t) ? max1 : t;
System.out.println(max2);
}
}
输出结果
20
30
30
Process finished with exit code 0
文章来源: blog.csdn.net,作者:Mr.Yushiwen,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/MrYushiwen/article/details/109606058
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)