JAVA操作符
几乎所有的操作符都只能操作“基本类型”
“=”、“= =”和“!=”,它们能操作所有对象
String类支持“+”和“+=”
整型:int,short,byte,long
浮点型:float,double
字符:char
布尔:boolean
类型 | 字节 |
boolean | 1/8 |
byte | 1 |
char | 2 |
short | 2 |
float | 4 |
int | 4 |
long | 8 |
double | 8 |
优先级
先乘除后加减
字符串连接:String后跟一个“+”,+后非String类型就会自动转换为String类型
赋值
基本类型赋值:将一个地方的内容复制到了另一个地方(基本类型存储的是实际的值)
对象赋值(别名现象):将引用从一个地方复制到了另一个地方(一定要小心)
方法别名:
void f(Letter t) {t.c = 'a';} //t对象中内容会被改变
算术操作符
双目运算符包括:(加)+,(减)-,(乘)*,(除)/,(求余)%
+=、-=、*=、/=、%=
单目运算包括:+(正),-(负),++(自增),--(自减)
- 当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则
运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。
short s1 = 1; s1 = s1 + 1; //错误,高位转低位需要强制转换/低位转高位自动转,将int赋值给short需要强制转换
short s1 = 1; s1 += 1; //正确,s1+=1等效于s1=(short)(s1+1)
一元减号-(负)用于转变数据的符号
一元加号+(正)用于将较小的操作数提升为int
++在前就是"先加后赋"(++i)
++在后就是"先赋后加"(i++)
1)这些运算符的运算对象可以是byte、short、int、long、float、double、char类型,其中char类型在运算时被自动转为int型。
2)在Java中,整数被0除或对0取余属于非法运算,将抛出AtrthemticExcerption。
3)求余运算(%)的两个运算对象不但可以是整数,也可以是浮点类型;不但可以是正整数,也可以是负整数,其计算结果的符号与求余运算符左侧的运算对象符号一致。
4)如果参与除法运算的两个运算对象都属于整型,则运算为整除运算,若希望得到小数部分的商值则需要对其中一个运算对象的类型作强制转换。A/(float)B
5)运算符“+”的运算对象可以使String,它的操作含义是将两个字符串连接。
关系操作符
大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、等于(==)和不等于(!=)
等于和不等于适用于所有基本类型,其他比较符不适用于boolean类型
==与!=也适用于所有对象,比较的是对象的引用
比较对象的实际内容是否相等,使用equals(),此方法不适用于基本类型,基本类型直接使用==和!=即可
注意:equals()默认行为是比较引用,大多数类库都实现了equals()方法用来比较对象的内容;自己定义的类中要达到这种效果,需要重写该方法。
逻辑操作符
与(&&),或(||),非(!)
“与”,“或”,“非”只应用于布尔值
如果在应该使用String值的地方使用布尔值,布尔值会自动转换成适当的文本形式
在逻辑表达式中,如果能通过逻辑运算符左边表达式的值就能推算出整个表达式的值,那么将不再继续执行逻辑运算符右边的表达式。(&&,||)
直接常量
大写(小写)的L,代表long
大写(小写)的F,代表float
大写(小写)的D,代表double
注:如果编译器能正确识别类型,就不必在数值后附加字符
十六进制:以前缀0x(0X),后面跟随0-9或小写(大写)a-f来表示
八进制:以前缀0,后面跟随0-7来表示
Integer.toBinaryString
Long.toBinaryString
指数计数法
在java中e代表10的幂次,eg: 10E2 //10的2次方 10e-5 //10的-5次方
编译器通常会将指数作为双精度数(double)处理
按位操作符
按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果
与:1&1==1 1&0==0 0&0==0 //同为1时,输出1;否则输出0
或:1|1==1 1|0==1 0|0==0 //同为0时,输出0;否则输出1
非:~0==1 ~1==0 //取反操作,属于一元操作符,不可与“=”联合使用
异或:1^0==1 1^1==0 0^0==0 //不同为1,同为0
按位操作符可与等号(=)联合使用,以便合并运算和赋值:&=,|=和^=
可将布尔类型作为一种单比特值对待,可对它执行按位“与”,“或”,“异或”运算,不能执行按位“非”。eg: true & false
public int[] swapNum(int num1, int num2) {
num1 = num1 ^ num2;
num2 = num2 ^ num1;
num1 = num1 ^ num2;
int[] nums = {
num1, num2
};
return nums;
}
移位操作符
将操作符左边的操作数向左移动,低位补0
将操作符左边的操作数向右移动,如符号为正,高位插入0;若符号为负,高位插入1
将操作符左边的操作数向右移动,无论正负,都在高位插入0
移位操作符操作的运算对象也是二进制的“位”
移位操作符只用来处理整数类型
对char、byte或short进行移位处理,在移位之前,会被转换为int类型,得到的结果也是int类型
移位可与等号组合使用(<<= 或 >>= 或 >>>=),在对char或short进行>>>=时,可能得到不正确的结果
三元操作符
result = boolean-exp ? value0 : value1;
如果boolean-exp计算结果为true,那么result为vaulue0,否则result为value1
类型转换操作符
java允许把任何基本数据类型转换成别的基本数据类型,但布尔类型除外
将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型,需要显示的强制转换,因为可能会面临信息丢失危险
int i = 1;
short s = (short) i;
在进行窄化转换时,当浮点数转换为整型时,会对浮点数进行截尾操作,并不会四舍五入(Math.round()可以实现)
不必显示的进行任何类型的转换,因为新类型肯定能容纳原来类型的信息,不会造成任何信息的丢失
short s = 1;
int i = s;
如果对基本类型执行算数运算或按位运算,只要类型比int小(即char,byte,short),那么在运算前,这些值会自动转换成int
通常,表达式中出现最大的数据类型决定了表达式最终结果的数据类型。eg:float与double相乘,结果就是double