运算符:
1. 运算符的分类:单目运算符,双目运算符,三目运算符
单目运算符只有需要一个操作数的运算符,如:--、++等
双目运算符需要两个操作数的运算符,如:+、-、*、/、= 等
三目运算符需要三个操作数,只有一个 ? :
2. 运算结果的数据类型:是参与运算的最大数据类型
取余数运算:结果的正负数:和被除数相同
3. 三元运算符和if-else语句:不同之处。
a) 三元运算符是必须要有返回值,而if-else语句并不一定有返回值,其执行结果可能是赋值语句或者打印输出语句。
b) java三元表达式有字符强转(双目数值提升)的功能,返回值类型为两个返回值中类型精度更高的的那个类型
1) 在java中常见数据类型其范围从小到大(精度由低到高):byte<short<char<int<float<double。
2) jvm在给数值分配数据类型的时候会选取刚好能装下该数据大小精度的数据类型进行分配(如99.0为float,99为byte/short)
c) 三元表达式的性能更好。
d) 举例:
下面用一段代码来解释三元表达式的字符强转功能,以下测试代码也涵盖了很多面试题目,希望各位可以从中理解上述三条规则。
char a=‘a‘;
int i=96;
//规则1,定义了数据类型的变量与未定义变量的数值
System.out.println(2==2?i:9.0); //返回96.0
//jvm给9.0分配数据类型为float,所以返回值类型为float
System.out.println(2==2?98:a); //返回b
//jvm给98分配数据类型为byte/short,所以返回值类型为byte/short,故结果会变为ASCII码98对应的字符
//规则2,两个已经定义数据类型的变量
System.out.println(2==2?a:i);//返回97
//返回值类型为int,返回值为a,返回结果为a的控制字符‘a’对应的ASCII码97
//规则3,两个未定义的数值
System.out.println(2==2?99:9.0);//返回99.0
System.out.println(2==2?99:‘b‘);//返回C
4. 关于equals和==的区别
解释一下==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。
equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
String里的方法,如果==号比较不相等,还会进行一下值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。
如果没有重写该方法,那么他和==号等价。
5. 运算符的优先级:
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | 后置++ | 后置自增运算符 | 变量名++ | 左到右 |
|
后置-- | 后置自减运算符 | 变量名-- |
| ||
[ ] | 数组下标 | 数组名[整型表达式] | |||
( ) | 圆括号 | (表达式)/函数名(形参表) |
| ||
. | 成员选择(对象) | 对象.成员名 |
| ||
-> | 成员选择(指针) | 对象指针->成员名 |
| ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 |
| ||
前置++ | 前置自增运算符 | ++变量名 | 单目运算符 | ||
前置-- | 前置自减运算符 | --变量名 | 单目运算符 | ||
* | 取值运算符 | *指针表达式 | 单目运算符 | ||
& | 取地址运算符 | &左值表达式 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof 表达式/sizeof(类型) |
| ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式%整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 表达式<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 表达式>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 整型表达式&整型表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 整型表达式^整型表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 整型表达式|整型表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 |
|
/= | 除后赋值 | 变量/=表达式 |
| ||
*= | 乘后赋值 | 变量*=表达式 |
| ||
%= | 取模后赋值 | 变量%=表达式 |
| ||
+= | 加后赋值 | 变量+=表达式 |
| ||
-= | 减后赋值 | 变量-=表达式 |
| ||
<<= | 左移后赋值 | 变量<<=表达式 |
| ||
>>= | 右移后赋值 | 变量>>=表达式 |
| ||
&= | 按位与后赋值 | 变量&=表达式 |
| ||
^= | 按位异或后赋值 | 变量^=表达式 |
| ||
|= | 按位或后赋值 | 变量|=表达式 |
| ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |