运算符:
1、算术运算符:
+、-、*、/即加、减、乘、除;
注意:
1、+、-不仅可以用于进行算术运算,也可以用于放在数字前面表示数字的正负号;
2、+还可以用于字符串的连接。
2、自增自减运算符(++、--)
++、--在前,表示先进行自加1或者自减1,然后再参与赋值运算;
++、--在后,表示先进行赋值运算,然后自加1或者自减1;
且不论++、--在前或者是在后,最终该值都加自加1或者自减1.
如:
Int a=1;
Int b=++a;
输出b=2,a=2;
Int a=1;
Int b=a++
输出b=1,a=2
使用自增自减运算符时,并不进行类型提升,操作前数值是什么类型,操作后数值仍然是什么类型。
如:
Byte b1=1;
Byte b2=(byte)(b1+1);
Byte b3=++b1;
注意:
从操作中可以看到,自增自减预算符是比较复杂的,而且有很多需要注意的问题。所以在开发过程中,不是非常必要的时候,尽量不要使用自增自减运算。
3、关系运算符
大于(>)、小于(<)、小于等于(<=)、大于等于(>=)、等于(==)、不等于(!=
)
如:int a=5;
Double d=5.0;
Boolean b=(a==b);
System.out.println(b);
输出结果为:true
注意:说明两个不同类型的数据在进行关系运算时,系统会自动将运算范围低的一样转换成运算范围高的一方。
4、位运算符
与(&):如果对应的位都是1,则结果为1,否则结果为0;
或(|):如果对应的位都是0,则结果为0,否则结果为1;
异或(^):如果对应的位值相同,则为0,否则则为1;
非(~):将操作数的每一位都按位取反。
如:
public class Wei
{
publicstatic void main(String[] args)
{
inta=5;
intb=6;
intc=a&b; //执行与位运算
System.out.println("c的输出值为:"+c);
intc2=a|b; //执行或位运算
System.out.println("c2的输出值为:"+c2);
intc3=a^b; //执行异或运算符
System.out.println("c3的输出值为:"+c3);
intc4=a^b^b; //执行双异或运算符
/*
注意:某个数与同一个数据异或两次,最终得到的结果还是该数本身的值。
*/
System.out.println("c4的输出值为:"+c4);
intc5=~a; //执行非位运算符
System.out.println("c5的输出值为:"+c5);
}
}
注意:
1、 位运算符都是针对二进制位数值(0和1)操作,故位运算只能对整数使用;
2、 某个数与同一个数据异或两次,最终得到的数据值还是该数据本身的值
该结论有两种用法:
1、 对文件进行加密操作,只需要将该文件异或一下,自己提供参与异或(^)的数据值,最终需要读原文件的时候只需要再次进行异或(^)一次即可。
2、 如果将两个int型变量数据进行对换的方法:
a、 引入第三方int变量:
如:int a=3;
Int b=4;
int c;
c=a; //a的值赋值给c
a=b; //b的值赋值给a
b=c; //c的值赋值给b
System.out.println(a);
System.out.println(b);
该输出结果为:4
3
b、 使用异或(^):
如:public class Test
{
public static void main(String[] args)
{
int a=3;
int b=4;
a=a^b; //定义a的值为a^b
b=a^b; //b=a^b=(a^b)^b=a=3
a=a^b; //a=a^b=a^(a^b)=b=4
System.out.println("a的值为:"+a);
System.out.println("b的值为:"+b);
}
}
该输出结果为:a:4
b:3
c、 使用a+b的和或者是差
注意:如果a、b的数值起初非常大,相加或相减后容易超过int类型的上限值或者下限值,故一般不推荐此方法。
如:
public classTest21
{
public static void main(String[] args)
{
int a=3;
int b=4;
b=b-a; //定义b=b-a
a=b+a; //a定义为a=b+a=(b-a)+a=b=4
b=a-b; //b定义为b=a-b=b-(b-a)=a=3
System.out.println("a的输出值为:"+a);
System.out.println("b的输出值为:"+b);
}
}
该输出结果为:a:4
b:3
5、移位运算符
左移(<<)、右移(>>)、无符号右移(>>>)都是针对数据的二进制位进行操作。
左移(<<):将数据换算成二进制位,然后往左移动,右边的空位用0来补。
右移(>>):将数据换算成二进制位,然后往右移动,如果数据移动前首位为1(即为负数),则移动后右边的空位用1来补位,如果数据移动钱首位为0(即为正数),则移动后右边的空位用0-来补位。
无符号右移(>>>):将数据换算成二进制位,然后往右移动,只是填充时,不管原数的是正或者是负,都使用0来填充。
如:
public class Test22
{
publicstatic void main(String[] args)
{
inta=8;
intb=a>>1; //往右移动1位
System.out.println("b往右移1位后数值为:"+b);
intc=a<<1; //往左移动1位
System.out.println("c往左移1位后数值为:"+c);
intd=a>>>2; //无符号往右移动2位
System.out.println("d往无符号往右移动1位后数值为:"+d);
}
}
输出结果为:
注意:
1、 移位运算符因为是对二进制为进行操作,故该运算符只能对整数运算;
2、 一个整数在往左做左移位运算时,数值会越来越大,在往右移做右移位运算时,数值会越来越小。
3、 左移其实就似乎乘以2的移动的位数次幂;右移时,如果该数为奇数就是(该数-1)后,除以2的移动的位数次幂,如果该数为偶数就是该数除以2的移动的位数次幂。
对应练习:
1、 最有效率的方式算出2乘以8等于几?
直接使用2*8其实在计算机底层是该两数二进制位进行相乘得出的结果。
使用移位运算符更高效。
如:
public class Test23
{
public static void main(String[] args)
{
int a=2;
int b=a<<3; //将2往左移动3位
System.out.println("b的输出值为:"+b);
}
}
输出结果为:
2、 对两个整数型变量的值进行互换(不需要引进第三方变量)
6.逻辑运算符:
1、非短路逻辑运算符:
与(&)、或(|)、非(!)
如:
public class Test24
{
publicstatic void main(String[] args)
{
inta=5;
intb=3;
booleanb1=(a>4)&(b<4); //执行逻辑与运算符
booleanb2=(a<4)|(b>4); //执行逻辑或运算符
booleanb3=!(a>4); //执行逻辑非运算符
System.out.println("使用与逻辑运算符的结果为:"+b1);
System.out.println("使用或逻辑运算符的结果为:"+b2);
System.out.println("使用非逻辑运算符的结果为:"+b3);
}
}
3、 短路逻辑运算符:
双与(&&):当两个操作数都为true时,结果采薇true。要判断两个操作数,但是当得到的第一个操作数为false时,其结果就必定为false,这时候就不会再判断第二个操作数。
如:
public class Test25
{
publicstatic void main(String[] args)
{
inta=5;
booleanb=(a<4)&&(a++<10); //a=5>4,故该第一个语句执行完为false,故第二个就不会执行了。
System.out.println("使用逻辑与运算符的结果为:"+b);
System.out.println("a的结果为:"+a);
}
}
1、 三元运算符:
格式为:
Expression?statement1:statement2
如果expression为true的话,则执行statement1语句,如果expression为false,则执行statement2。
在进行条件语句判断时,可以替换if-else语句。
如:
public class Test26
{
publicstatic void main(String[] args)
{
inti,k; //声明一系列int类型值
i=5;
k=(i>=0?i:-i);//使用三元运算符进行判断
System.out.println("i的绝对值为:"+k);
i=-5;
k=(i>=0?-i:i); //使用三元运算符进行判断
System.out.println("i的绝对值为:"+k);
}
}
运算符的优先级如下表: