Java中的运算符
短路
1.true || 2.true || 3.false || 4.true
其中 走完1表达式 就不会再走了 节省了不必要的计算
1.true && 2.true && 3.false && 4.true
其中 走完3表达式 就不会再走了(结果已经为false) 节省了不必要的计算
字面量
如果程序里使用了一个字面量(literal value),则编译器能准确地知道它是什么类型的。
不过当类型模棱两可的时候,你就必须使用与该字面量相关的一些字符,以此添加额外信息来引导编译器
0x:十六进制前导
0(零):八进制
0B:二进制
F/f:float型后缀
D/d:double型后缀
L:long型后缀(规范:用大写 以区分i与l)
字面量中的下划线
可在数字字面量中加入下划线
规则:
- 只能使用单个下划线,不能连续使用多个;
- 数字的开头或结尾不能有下划线;
- 像
F
、D
或L
这样的后缀周围不能有下划线;- 在二进制或十六进制标识符
b
和x
的周围不能有下划线。
eg:
@Test
public void test(){
double a = 99_999_998.123;
System.out.println(a);//9.9999998123E7
int b = 0B1010_1110_1011_1111;
System.out.println(b);//44735
System.out.println(Integer.toBinaryString(b));//1010111010111111
}
位操作符
位移运算
>>
保留符号位右移(无符号右移)
<<
保留符号位左移(...)
>>>
不保留符号位右移
@Test
public void test1(){
System.out.println(-2 >> 1);//-1
System.out.println(-2 << 1);//-4
/**
* -2 -> 0B1000_0000_0000_0000_0000_0000_0000_0010
* -反-> 0B1111_1111_1111_1111_1111_1111_1111_1101
* -补-> 0B1111_1111_1111_1111_1111_1111_1111_1110
* 无符号右移后 (最高位补零)
* 0B01111_1111_1111_1111_1111_1111_1111_111
*/
System.out.println(-2 >>> 1);//2147483647
System.out.println(0B01111_1111_1111_1111_1111_1111_1111_111);//2147483647
}
类型转换
小数转整数
直接强制转换会将小数部分接去掉
@Test
public void test(){
float f1 = 1.1f;
float f2 = 1.9f;
double d1 = 1.1d;
double d2 = 1.9d;
System.out.println((int) f1);//1
System.out.println((int) f2);//1
System.out.println((int) d1);//1
System.out.println((int) d2);//1
}
四舍五入
Math.rund();
类型提升
(任何算数操作、按位操作)表达式中最大的数据类型 决定表达式返回数值的类型
short s1 = 2;
short s2 = 3;
int i1 = 1;
Object o1 = s1+s2;
Object o2 = s1+i1;
System.out.println(o1 instanceof Integer);//true 算数运算优先被转为int进行计算
System.out.println(o1 instanceof Short);//false
System.out.println(o2 instanceof Integer);//true
System.out.println(o2 instanceof Short);//false
java没有sizeof
C/C++中用来获取数据被分配的字节大小,为了移植性
不同的数据类型在不同机器上可能有不同的大小,所以在做一些与数据大小有关的运算时,程序员必须知道这些类型有多大。
Java不需要,java——与平台无关的语言