Java中的运算符
Java运算符分为几种?
算术运算符、关系运算符、位运算符、逻辑运算符、赋值运算符、其它运算符
算术运算符
点击查看代码
package com.leadmap.java.typecast;
/**
* Company: XXXXXX
*
* @description: 算术运算、类型转换
* @author: banmao
* @date: 2022/1/13 14:18
*/
public class ArithmeticOperation {
public static void main(String[] args) {
// 算术运算符
char ch = 'a'; // ASCII表中'a'表示的数字为97
int ch2i = ch; // 自动类型转换
long ss = ch; // 自动类型转换
System.out.println(ch2i); // 输出为97
int a1 = -9 % 3;
int a2 = -8 % 3;
System.out.println(a1); //输出为0
System.out.println(a2); // 输出的是-2
byte b1 = 11;
byte b2 = 12;
// 以下(b3-b7)编译出错,整型运算时,byte、short会自动类型提升为int
// byte b3 = b1 + b2;
// byte b4 = b1 - b2;
// byte b5 = b1 * b2;
// byte b6 = b1 / b2;
// byte b7 = b1 % b2;
// 操作符在左边表示先自增(自减),再运算
// 操作符在右边表示先运算,再自增(自减)
byte b8 = b1++;
byte b9 = b2--;
System.out.println("b1原值:" + b1 + ",b2原值:" + b2); // b1原值:12,b2原值:11
int b10 = ++b1 + b2;
System.out.println("(++b1 + b2)=" + b10); // (++b1 + b2)=24
System.out.println("b1:" + b1 + ",b2:" + b2); // b1:13,b2:11
int b11 = b1++ + b2;
System.out.println("(b1++ + b2)=" + b11); // (b1++ + b2)=24
System.out.println("b1:" + b1 + ",b2:" + b2); // b1:14,b2:11
int b12 = b1 + --b2;
System.out.println("(b1 + --b2)=" + b12); // (b1 + --b2)=24
System.out.println("b1:" + b1 + ",b2:" + b2); // b1:14,b2:10
int b13 = b1 + b2--;
System.out.println("(b1 + b2--)=" + b13); // (b1 + b2--)=24
System.out.println("b1:" + b1 + ",b2:" + b2); // b1:14,b2:9
char ch1 = 'a';
char ch2 = 'b';
// 以下(ch3-ch4)编译出错,整型运算时,byte、short会自动类型提升为int
// char ch3 = ch1 + ch2;
// char ch4 = b1 + ch1;
short sh1 = 22;
short sh2 = 23;
// 以下(sh3-sh4)编译出错,整型运算时,byte、short会自动类型提升为int
// short sh3 = sh1 + sh2;
// short sh4 = b1 + ch1;
// short sh5 = b1 + sh1;
// short sh6 = ch1 + sh1;
int i = 356;
byte b = (byte) i;
System.out.println(b); // 输出100,舍去了高位1
boolean bool1 = true;
boolean bool2 = false;
//int bool3 = (int) bool1; // 编译异常,boolean不能进行转换类型
//int bool4 = bool1 + bool2; // 编译异常,布尔型不能进行算术运算
}
}
关系运算符
点击查看代码
package com.leadmap.java.typecast;
/**
* Company: XXXXXX
*
* @description: 关系运算
* @author: banmao
* @date: 2022/1/13 16:03
*/
public class RelationalOperation {
public static void main(String[] args) {
// 关系运算,> < == != >= <=
// 基本数据类型使用关系运算符
int i1 = 97;
int i2 = 97;
short s1 = 97;
byte b1 = 97;
char c1 = 'a';
float f1 = 97f;
double d1 = 97d;
long l1 = 97L;
System.out.println(i1 == i2);
System.out.println(i1 == s1);
System.out.println(i1 == b1);
System.out.println(i1 == c1);
System.out.println(i1 == f1);
System.out.println(i1 == d1);
System.out.println(i1 == l1);
int i3 = 98;
short s2 = 100;
byte b2 = 122;
char c2 = 'c';
System.out.println(i3 > b2);
System.out.println(i1 < s2);
System.out.println(b1 > c2);
System.out.println(c1 < c2);
// 引用数据类型使用关系运算符
String str1 = "111";
String str2 = "111";
System.out.println(str1 == str2);
System.out.println(str1 != str2);
//编译报错 >、<、>=、<=不可用于引用类型
//System.out.println(str1 > str2);
// 引用数据类型与基础类型使用关系运算符
String str3 = "97";
int i4 = 97;
short s3 = 97;
// 编译报错,不可用于引用类型与基础类型进行关系运算
// System.out.println(str3 != c3);
// System.out.println(str3 <= s3);
}
}
位运算符
点击查看代码
package com.leadmap.java.typecast;
/**
* Company: XXXXXX
*
* @description: 位运算符
* @author: banmao
* @date: 2022/1/13 17:19
*/
public class BitOperation {
public static void main(String[] args) {
// 位运算符 &、|、^、~、<<、>>、>>>
// 按位与
byte b1 = 0b00001010;
byte b2 = 0b01001001;
byte b3 = (byte) (b1 & b2);
System.out.println("b3:" + b3);
byte b4 = (byte) (b1 | b2);
System.out.println("b4:" + b4);
byte b5 = (byte) (b1 ^ b2);
System.out.println("b5:" + b5);
byte b6 = (byte) (~b1);
System.out.println("b6:" + b6);
byte b7 = (byte) (b1 << 2);
System.out.println("b7:" + b7);
byte b8 = (byte) (b1 >> 2);
System.out.println("b8:" + b8);
byte b9 = (byte)213;
System.out.println("b9:" + b9);
byte b10 = -128;
byte b11 = (byte)(b10 >> 2);
byte b12 = (byte)(b10 >>> 2);
System.out.println("b11:" + b11);
System.out.println("b12:" + b12);
byte b13 = -0b00010001;
System.out.println(b13);
byte b16 = -17;
byte b17 = (byte)(b16 >> 2);
byte b18 = (byte)(b16 >>> 2);
System.out.println("b17:" + b17);
System.out.println("b18:" + b18);
//byte b14 = 0b10000000;
byte b15 = (byte)0b10000000;
System.out.println(b15);
// java首位为符号位吗?
// byte是为有符号位的整数,short、int、long都是
// 那为什么首位为符号位,不能将byte = 0b10000000呢?
byte b19 = (byte)-0b11100000;
byte b20 = (byte)-233;
System.out.println("b19:" + b19);
System.out.println("b20:" + b20);
}
}
逻辑运算符
点击查看代码
package com.leadmap.java.typecast;
/**
* @author banmao
* @version V1.0.0
* @date 2022/1/16 下午5:42
* @description 逻辑运算符
*/
public class LogicalOperator {
public static void main(String[] args) {
// 三种逻辑运算符 &&、||、!
int kk = 1;
int aa = 2;
// &&短路
if ((aa < kk) && comparator()) {
System.out.println("aa小于kk");
}
// ||短路
if ((aa > kk) || comparator()) {
System.out.println("aa大于kk");
}
if (!(aa >= kk)) {
System.out.println("aa不大于等于kk");
}
}
public static boolean comparator() {
System.out.println("进来了");
return false;
}
}
赋值运算符
点击查看代码
package com.leadmap.java.typecast;
/**
* @author banmao
* @version V1.0.0
* @date 2022/1/17 下午8:06
* @description 赋值运算符
*/
public class AssignmentOperator {
public static void main(String[] args) {
// 赋值运算符=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
int a = 5;
int b = 6;
a += b;
System.out.println("a+=b,a=" + a + ", b=" + b);
a -= b;
System.out.println("a-=b,a=" + a + ", b=" + b);
a *= b;
System.out.println("a*=b,a=" + a + ", b=" + b);
a /= b;
System.out.println("a/=b,a=" + a + ", b=" + b);
a %= b;
System.out.println("a%=b,a=" + a + ", b=" + b);
a <<= b;
System.out.println("a<<=b,a=" + a + ", b=" + b);
a >>= b;
System.out.println("a>>=b,a=" + a + ", b=" + b);
a &= b;
System.out.println("a&=b,a=" + a + ", b=" + b);
a ^= b;
System.out.println("a^=b,a=" + a + ", b=" + b);
a |= b;
System.out.println("a|=b,a=" + a + ", b=" + b);
//赋值运算符支持byte、char、short、int、long,且部分支持float、double、boolean
float a1 = 33;
float a2 = 22;
// 以下均编译异常,float、double不能进行位运算
// a1<<=a2;
// a1>>=a2;
// a1&=a2;
// a1^=a2;
// a1|=a2;
//将boolean的false看为0,true看为1,带入到位运算中
boolean b2 = true;
boolean b3 = true;
b2&=b3;
System.out.println("b2&=b3,b2=" + b2);
b2|=b3;
System.out.println("b2|=b3,b2=" + b2);
b2^=b3;
System.out.println("b2^=b3,b2=" + b2);
}
}
其他运算符(三目运算符与instanceOf)
点击查看代码
package com.leadmap.java.typecast;
/**
* @author banmao
* @version V1.0.0
* @date 2022/1/17 下午8:49
* @description 三目运算符与instanceof
*/
public class TernaryOperator {
public static void main(String[] args) {
// 三目运算符
int i = 1;
// 一般用做简单的逻辑判断的简写,较复杂的逻辑不建议使用三目运算符
String operator = operatorTernary(i);
System.out.println(operator);
// instanceOf运算符,用于判断对象类型
String s1 = "111";
if (s1 instanceof String) {
System.out.println("s1属于String对象实例");
} else {
System.out.println("s1不属于String对象实例");
}
}
private static String operatorTernary(int i) {
return i == 1 ? "i等于1" : "i不等于1";
}
}
运算符的优先级
运算符的优先级按以下图,从上到下,从左到右进行排序。运算符的优先级比较复杂,靠硬记也比较困难,其实记住小括号()、加减乘除、自增、自减、&&、||、关系运算符这些优先级就够了。
扩展
1、byte为有符号位整数,那为什么byte不能等于ob10000000(10000000是-128的补码,计算机中负数就是以补码存储的)呢?
byte b1 = 0b10000000; // 编译出错
byte b2 = (byte)0b10000000; // 强转
System.out.println(b2); // 输出-128
个人理解在于,在java编译中,所有的整数都是以它原值(无符号位)来判断范围的,比如10000000表示的是128,这时128不属于byte的范围(-128~127),于是编译出错,需要强转,当运行时,就将10000000作为符号位进行解析,于是打印出来b2为-128。个人总结:Java是运行时有符号整数。
2、右移运算中右操作数为负数时,结果会怎样?例如下面的例子
int x = -1;
System.out.println(x >>> -30); // 结果为0011 1111 1111 1111 1111 1111 1111 1111
3、怎么快速计算左移?
比如byte b1 = 1;b1 << 1 = 2,b1 << 2 = 4,b1 << 3 = 8,b1 << 4 = 16,这个规律性就出来了,左移一位,数字就增加两倍。右移也是如此,那无符号右移呢?无符号右移在正数情况是缩小两倍,但是在负数情况下不同。
4、为什么右移与无符号右移计算结果相同呢?比如byte b16 = -17;byte b17 = (byte)(b16 >> 2);byte b18 = (byte)(b16 >>> 2);结果都是-5
因为Java中byte的运算表达式会先提升类型为int,然后再去计算,所以byte转为int时高位都为0,于是不影响右移与无符号右移的结果。但是请看下面这个例子:
int i14 = 0b11111111111111111111111111111110; // 十进制等于-2
int i15 = i14 >> 1;
int i16 = i14 >>> 1;
System.out.println(i15); // 输出-1
System.out.println(i16); // 输出2147483647
当i14这个数进行右移时,无符号右移在左边补的是0,于是这个数符号位为0,所以为正的2147483647。
5、(1)当进行位运算时,负数参与运算时,都是用的补码进行运算。(2)byte b = -17,那么用二进制来声明的话,byte b = (byte) 0b11101111,用补码的形式来表示。(3)正数,负数的十进制值都是用原码来计算的,比如-17虽然在计算机中用补码来表示=(byte) 0b11101111,但是输出在控制台中,是以(byte) 0b10010001来输出的=(-17)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能