目录
一、操作符的作用
在JAVA最底层,数据时通过使用操作符来操作的。操作符接受一个活多个参数,返回生成的新值。参数的形式与普通方法不一致,但是结果相同。
二、常用操作符
1、赋值
赋值使用操作符“=”。意思是“区右边的值(右值),把它复制给左边的值(左值)”。右边的值可以是常数、变量、表达式等,但左值必须是类型明确、有确定名称的变量。也就是说,必须有一个物理空间可以存储右边的值。
int a = 1;
a是基本类型,它的赋值比较简单,因为基本类型直接存储数据值。假如新增加int b = a;将a的值复制给b后,如果修改a的值为2,但是b的值仍是1。
String a = "abc";
String b = a;
将字符串a复制给b,因为a是String类型,b获取到的值a的值的引用地址,如果修改a的值,则b的值也会变化。
2、算术操作符
JAVA的基本算术操作符与大多数语言一样,包括加号(+)、减号(-)、乘号(*)、除号(/)以及取模操作符(%)。
算术操作符可以写入完整的参数,也可以简写,例如将变量i加1:
int i = i + 1;
int i += 1;
注意:
①整数除法运算结果会直接舍弃小数部分,而不是四舍五入。
②一元减号用于转换数据的符号,一元加号只是为了与一元减号对应,基本没有什么作用,唯一的作用就是将较小类型的变量提升为int类型。
3、自动递增(++)和自动递减(--)
JAVA提供了很多快捷运算操作符,使编码更方便,递增和递减是其中两种很常用的操作符。递增操作符是"++",意义是“变量值加1”,递减操作符是"--",意义是“变量值减少1”。递增和递减操作符不仅根据输入参数产生新的运算结果,同时会改变输入参数的值。
递增和递减操作符有两种使用方式,“前缀式”和“后缀式”。“前缀递增”表示“++”操作符在输入参数的前边,“后缀递增”表示“++”操作符在输入参数的后边。类似的,“前缀递减”表示“--”操作符在输入参数的前边,“后缀递减”表示“--”操作符在输入参数的后边。
对于“前缀递增”和“前缀递减”,会先执行运算,再返回结果;“后缀递增”和“后缀递减”会先返回结果,再执行计算。
int i = 1;
System.out.println("i:" + i);
System.out.println("运算结果:" + ++i + ",i值:" + i);
System.out.println("运算结果:" + i++ + ",i值:" + i);
System.out.println("i:" + i);
System.out.println("运算结果:" + --i + ",i值:" + i);
System.out.println("运算结果:" + i-- + ",i值:" + i);
------------------输出结果---------------
i:1
运算结果:2,i值:2
运算结果:2,i值:3
i:3
运算结果:2,i值:2
运算结果:2,i值:1
4、直接常量
一般情况下,使用直接常量,编译器能够识别参数类型,但是有些时候模棱两可,就需要增加说明,帮助编译器准确识别区分常量的类型。
直接常量可以使用后缀或前缀,用来标识它的类型。
基本类型常用后缀来标识:long类型可以用“l”或“L”表示,float类型可以用“f”或“F”表示,double类型可以使用“d”或“D”表示。
long l = 1000; //正整数默认是int类型,long范围大于int,可以自动转换
long l2 = 1000l;
long l3 = 1000L;
float f = 1; //小数默认是double类型
float f2 = 1.23f;
float f3 = 1.23F;
double d = 1.23;
double d2 = 1.23d;
double d3 = 1.23D;
进制类型标识方式如下:
①二进制(Binary):字符范围0-1,如 0110。前缀用0b(0B)表示,如0b110;后缀用B表示,如 1101001B;
②八进制(Octal):字符范围0-7,满 8 进 1。前缀用0表示,如 076;后缀用O表示,如 147O ;
③十进制(Decimal):字符范围1-9,满9进1。后缀用D表示,如109D;
④十六进制(Hexadecimal):字符范围0-9, A-F,满 16 进 1,前缀用0x(0X)表示,如 0x5AF9;后缀用H表示,如 2FH。
进制 | 英文 | 字符范围 | 前缀 | 后缀 |
---|---|---|---|---|
二进制 | Binary | 0-1 | 0b/0B | B |
八进制 | Octal | 0-7 | 0 | O |
十进制 | Decimal | 0-9 | \ | D |
十六进制 | Hexadecimal | 0-9, A-F | 0x/0X | H |
5、关系操作符
关系操作符返回一个boolean类型的结果,计算的是操作数的值之间的关系。如果关系成立,关系表达式返回一个true;如果不成立,则返回false。
关系操作符包括:小于(<)、大于(>)、等于(==)、小于或等于(<=)、大于或等于(>=)、不等于(!=)。等于和不等于适用于所有基础数据类型,其他操作符适用于除boolean类型之外的所有基本类型。因为boolean类型只有true和false两个值,大于小于没有意义。
关系比较的时候,常用一个方法“equals”,在Object类中,equals方法比较的是对象的引用地址。因此大部分的类(比如String类)都会重写equals方法,让其比较对象的内容,而不是引用地址。
6、逻辑操作符
逻辑操作符“与”(&&)、“或”(||)、“非”(!),会根据参数的逻辑关系,返回一个boolean类型的结果。常用在多个关系操作结果的联合比较。参数的类型只能是boolean类型。
使用逻辑操作符的时候,会遇到一种“短路”现象。即多个判断条件,前边的可以明确判断为false,后边的判断条件就不需要在执行:
int a = 1;
int b = 2;
if (a++ > 0 || b-- > 0) {
System.out.println("a:" + a + ", b:" + b);
}
------------执行结果------------
a:2, b:2
通过执行结果可以发现,“||”操作符后边的“b--”并没有运行。
但是还有一种“非短路”逻辑操作符,“与”(&)、“或”(|),操作符前后的所有代码都会执行。
int a = 1;
int b = 2;
if (a++ > 0 | b-- > 0) {
System.out.println("a:" + a + ", b:" + b);
}
------------执行结果----------
a:2, b:1
通过执行结果可以发现,即使“||”操作符前边的‘a++ > 0’条件成立,操作符后边的“b--”仍然会运行,并没有发生短路。在实际使用中需要根据需要领会运用。
7、三元操作符
三元操作符,也称为三目操作符、条件操作符。与别的操作符有些不一样,由三个操作数组成。
boolean-exp ? value1 : value2
根据boolean-exp表达式做判断,如果表达式返回值为true,就执行前边的value1,并将计算结果作为最终结果返回;如果表达式返回值为false,则执行后边的value2,同样计算结果作为最终结果返回。
使用if-else可以实现同样的功能需求,但是相比较而言,三元操作符更加简洁。
8、按位操作符
按位操作符用来操作整数基本类型中的单个“比特”(byte),即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。
按位操作符来源于C语言面向底层的操作,在这种操作中经常需要直接操纵硬件,设置硬件寄存器内的二进制位。JAVA设计初衷是嵌入电视机机顶盒内,所以这种面向底层的擦做被保留下来。但是,一般很少会用到位操作符。
- 如果两个输入位都是1,则按位“与”(&)操作符生成一个输出位1;否则生成一个输出位0。
- 如果两个输入位中只有一个为1,则按位“或”(|)操作符生成一个输出位1,只有两个输入位都是0的情况下,才会生成一个输出位0。
- 如果输入位的某一个是1,但不全是1,那么按位“异或”(^)操作符生成一个输出位1。
- 按位“非”(~)操作符,也称为取反操作符,属于一元操作符,只对一个操作数进行操作(其他操作符是二元操作符)。按位“非”生成与输入位相反的结果。如果输入位为1,则输出位为0;如果输入位为0,则输出位为1。
按位操作符可以与等号(=)联合使用,以便合并运算和赋值:&=、|=和^=都是合法的(由于~是一元操作符,所以不可以与等号联合使用)。
9、位移操作符
位移操作符操作的对象也是二进制的“位”。位移操作符只可以处理整数类型。左移位操作符(<<)能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)。“有符号”右移位操作符(>>)则按照操作符右侧指定的位数将操作符左侧的操作数向右移动。“有符号”右移位操作符使用“符号扩展”:若符号为正,则在高位插入0;若符号位负,则在高位插入1。JAVA中增加了一种“无符号”右移位操作符,它使用“零扩展”:无论正负,都在高位插入0。
如果对byte、short或char类型进行位移处理,那么在进行位移之前,它们会被转换为int类型,并且得到的结果也是int类型。只有数值右端的低5位才有用,这样可以防止位移超过int型所具有的位数。若对long类型数据进行位移处理,得到的结果也是long类型。此时只会用到数值最右端的低6位,以防止位移超过long类型数值范围。
位移可以与等号(=)组合使用(<<=或>>=或>>>=)。此时,操作符左侧的数值会按照右侧值指定的位数进行移动,再将得到的结果赋给左侧的变量。
但在进行“无符号”右移位操作符结合赋值结果时,可能会遇到一个问题:如果byte或short值进行这样的位移运算,得到的可能不是正确的结果。它们会先被转换位int类型,在进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能会得到-1的结果。
10、字符串操作符
字符串操作符有“+”和“+=”,有一项特殊的作用:连接不同的字符串。
字符串操作符有一些很有趣的行为:如果表达式以一个字符串开头,那么后续所有操作数都按照字符串类型处理(编译器会把双引号内的字符序列自动转换成字符串)。
注意:由于String是final的,虽然可以使用操作符进行拼接,但是在内存中都要创建新的对象,效率较慢。在循环中要大量执行String +操作的时候,使用Stringbuilder,多线程使用StringBuffer。
11、类型转换操作符
类型转换(cast)的原意为“模型铸造”。在适当的时候,JAVA将一种类型自动的转换为另一种类型。例如byte→short→int→long,数据类型可以自动转换,因为编译器会帮我们进行自动转换。但是如果不能自动转换时,JAVA允许显式的进行类型转换,或者进行强制转换。
要想进行类型转换,需要将希望得到的数据类型置于圆括号()内,放在要进行类型转换的值的左边。
JAVA允许我们把任意基本类型转换为其他基本类型,boolean类型除外,后者不允许进行任何类型转换。类只可以在其所属的类族中进行类型转换。