Java SE 运算符
1、运算符
运算符是一些特殊符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面。
1.1、主要有6种:
- 算数运算符 +;-;*;/;%;++;–;
- 赋值运算符 =;+=;-=;*=;/=;%=; --> a+=a+b;
- 位运算符 >>; >>>; <<; &;|;^;~ 取反;
- 比较运算符|关系运算符 >; >=; <; <=; ==; != ;
- 逻辑运算符 !; &;^ ; | ;&&; ||;
- 条件运算符 条件? 值1 :值2 ;
操作数: 运算符左右两边的数据为操作数 a*b a++
表达式: 运算符连接两边的操作数整体称为表达式 a+b
语句 : ;代表语句的结束
1.2、可分为3类:
- 一元运算符: 操作数只有一个的运算符 a++ ++a – +(正号) -(负号)
- 二元运算符: 操作数只有两个的运算符 + - * / % …
- 三元运算符: 条件运算符 表达式 ? 值1 :值2 ;
2、算术运算符
-
+ ;正号(省略);
加法运算 a+b;
字符串的连接符 : 当+左右两边一旦出现字符串,+都作为字符串的连接符使用,把两边的数据最终连接成为一整个字符串。
-
- ;减
-
***** ;乘
-
/ ;求商
-
% ;求余数
-
++ ;自增,自身+1;
- a++先赋值再自身加1;
- ++a 先自身加1再赋值;
-
– ;自减,自身-1;
- a-- 先赋值再自身减1;
- –a 先自身减1再赋值;
int a = 4;
int b = 1;
int c = 5;
int i = 3;
System.out.println("a=" + a); //"a=4"
System.out.println("b = "+b); //"b = 1"
//作为拼接
System.out.println("hello"+'a'+1); // "helloa1"
System.out.println('a'+1+"hello"); // "98hello"
//乘;商;余
int sum=a*b; //4
int y=b/a; //0
int v=a%b; //1
//++ --使用方法 a++先赋值再自身加1 ++a 先自身加1再赋值
//++ --使用方法 a++先赋值再自身加1 ++a 先自身加1再赋值
int r = i++ + ++i + i++ + i++ + ++i;
System.out.println(i); //8
System.out.println(r); //2
3、赋值运算符
- = ;赋值
- += ;–> a+=b;== a=a+b;
- -= ; a-=b => a=a-b;
- = ;ab a=a*b;
- /= ;a/=b a=a/b;
- %= ;a%=b => a=a%b;
推荐使用
优点:
执行效率高
帮助自动做强制类型转换 (++,+=等可以实现自动强制类型转换)
缺点:
不够直观
//正常写法
a = a+1; //a +=1;
System.out.println(a+=b);
System.out.println(a+","+b);
System.out.println(a-=b);
System.out.println(a+","+b);
System.out.println(a*=b);
System.out.println(a+","+b);
System.out.println(a/=b);
System.out.println(a+","+b);
System.out.println(a%=b);
System.out.println(a+","+b);
a+=10;
//a+=1; a++;
System.out.println(a+","+b);
short s = 1;
s = (short)(s+1);
//帮助自动做强制类型转换
s++;
s+=1;
System.out.println(s);
4、位运算符
先把操作数转为二进制,然后运算,结果转为十进制。
十进制整数转为二进制:
使用十进制的整数不停的除以2,最终的结果为0的时候,从下晚上看余数
0b开头标识二进制的整数
二进制转为十进制:
从最后一位数开始,不停的通过这一位置的数据*当前进制数^0,次方每次+1,最终的和就是十进制的表现形式
- & ; 全1为1
- | ; 全0为0
- ^ ; 相同为0;不同为1;
- 以上三个运算符,当两边的操作数为boolean,最为逻辑运算符,当两边的操作数为数字,作为位运算符存在
- 注意: 一个数据如果对另一个数据异或两次,结果是元数据本身
- ~ 取反 ; 1变0;0变1;
- >> ; 向右移;高位为1添1,高位为0添0;
- 操作数1>>操作数2 : 操作数1先转为二进制,然后对二进制的操作数1向右移动操作数2个位数,移出的数据不看,保留的数据转为十进制
- ==规律: 变小 操作数1>>操作数2 > 操作数1/2^操作数2
- ** >>> ;** 无条件向右移,添0;
- ** << ;** 向左移,末位添0;
- 操作数1<<操作数2 : 操作数1先转为二进制,然后对二进制的操作数1向左移动操作数2个位数,空位补0,保留的数据转为十进制
- ==规律: 变大 操作数1<<操作数2 > 操作数1*2^操作数2
System.out.println(10);//10
System.out.println(0b10);//2
System.out.println(0b1110);//14
System.out.println(2&3); //2
System.out.println(2|3); //3
System.out.println(2^3); //1
System.out.println(2^3);
System.out.println(14>>2); //3
System.out.println(2<<2); //8
System.out.println(14<<3); //112
5、比较运算符|关系运算符
- . > ; 大于
- . >= ; 大于等于
- . < ; 小于
- . <= ; 小于等于
- 操作数只能为为基础数据类型的数据 byte,short,int,long,float,double,char
- . == ; 是否相等
- . != ; 是否不等
- 任意类型都能判断
注意:
所有的比较运算符结果为boolean值
boolean 类型不参与类型转换
!=就是==取反
注意:
- 如果以后比较字符串内容是否相等,都通过equals() 进行比较 ;
- 字符串1.equals(字符串2) --> 相等true,不相等false;
- equals就是根据两个字符串的内容比较字符串是否相等;
String name = "zhangsan";
String name2 = "zhangsanfeng";
System.out.println(name==name2);
System.out.println(true!=false);//true
System.out.println(true!=3>2);//false
String name;
String password;
Scanner sc =new Scanner(System.in);
System.out.println("输入用户名:");
name=sc.nextLine();
// sc.nextLine();
System.out.println("输入密码:");
password=sc.nextLine();
// sc.nextLine();
if(name.equals("admin") && password.equals("123456")){
System.out.println("管理员用户");
}else if(name.equals("normal") && password.equals("654321")){
System.out.println("普通用户");
}else{
System.out.println("错误");
}
6、逻辑运算符
- ! ; 非,取反 ;!true=>false !false->true。
- **& ;**与 ;两边都满足才是满足,一个为false就是false。
- ^ ; 异或 ; 两边的操作数相等为false,不等为true。
- | ; 或 ;一个为true就是true,两个都为false才是false。
- && ; 短路与
- || ; 短路或
- 如果操作操作数能够决定整个结果,右边的操作数将不会执行。
注意:
逻辑运算符两边操作数结果必须为boolean 。
逻辑运算符最终的结果boolean类型的值。
建议使用短路运算符。
System.out.println("---------&与------"); //全true为true
System.out.println(true&false);//false
System.out.println(true&true);// true
System.out.println(false&true);//false
System.out.println(false&false);//false
System.out.println(false&&5/0==0);//false
System.out.println("------| 或-------"); //全false为false
System.out.println(true|true);//true
System.out.println(true|false);//true
System.out.println(false|false);//false
System.out.println(true||5/0==0);//true
System.out.println("-------^异或-------");//相同为false,不同为true
System.out.println(true^true);//false
System.out.println(false^true);//true
System.out.println("--------!非-------");//取反
System.out.println(!true);//false
System.out.println(!false);//true
System.out.println("----------&&---------------");
System.out.println(true && false); //false
System.out.println(true && true); //true
System.out.println(false && true); //false
System.out.println(false && false); //false
System.out.println("zhangsan"!="zhangsan" & "lisi".equals("lisi")); //false
//System.out.println("zhangsan"!="zhangsan" & 5/0==0); //java.lang.ArithmeticException: / by zero
System.out.println("zhangsan"!="zhangsan" && 5/0==0); //false,因为第二个操作数不会执行,发生短路
String name = "张三";
int pwd = 1234;
//用户名与张三相等,同时必须是否为123相等,相等登录成功,不等登录失败
if(name.equals("张三") && pwd==123 ){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
7、条件运算符
- 条件? 值1 :值2 ;
- 表达式的结果为boolean类型,true|false
条件: 是一个值为boolean类型的表达式 true|false
执行流程:
- 计算条件表达式
- 如果值为true,最终的结果为值1
- 如果值为false,最终的结果为值2
条件运算符与if语句之间的区别:
- 条件运算符肯定会得到一个结果,if不一定
- 条件运算符结果只能为某一个值,if语句体可以是一个语句块
- 条件运算符对简单的条件判定效率高,毕竟是运算符, if对复杂的比较适合
int a1=3;
int b2=4;
int c3=5;
int d4;
//如果表达式值为true,结果为值1
//如果表达式值为false,结果为值2
d4=a1>b2? a1:b2;
d4=d4>c3? d4:c3;
System.out.println("最大数:"+d4);
// 单目算数位关系,逻辑三目后赋值;
//a=5 b=6
d4 = a1 > b2 && a1 > c3 ? a : (b2 > c3 ? b2 : c3);
System.out.println(d4);
//
boolean max = a1 < b2 ?( ++a1 * 2 > b2 | (a1*=2) ==12 ): (a1 < b2);
System.out.println(max); //true
System.out.println(a1); //6
char f='a';
System.out.println(f+1);
8、运算符优先度
单目算数位关系,逻辑三目后赋值;
运算符的优先级:
- 优先级: 优先执行谁
- 口诀: 单目算数位关系,逻辑三目后赋值
- 默认从左向右运算,()|. 优先级最高
- & > ^ > | > && > ||
根据操作数的个数进行根类
- 单目: 操作数只有一个 ++ – +正号 -负号 !
- 双目: 操作数有2个 + - * / % > < …
- 三目: 条件运算符
//&& 与 || 之间的优先级: &&优先级高于||
System.out.println(true && true || false); //true
System.out.println(true || true && false); //true