阅前说明:本系列笔记仅记录读书过程中本人不会或不熟的知识点。
第3章 操作符、
3.2 使用Java操作符
- “=”、“==”、“!=”这些操作符可以操作所有对象;
- 其他几乎所有的操作符只能操作“基本类型”。
- String类型支持“+”和“+=”,代表字符串拼接。
3.3 优先级
- 即便Java中对各操作符的优先级有明确规定,但是我们要保持优良的编码习惯,即用小括号来标明计算顺序。
- 对于String,“+”意味着字符串连接,如果必要,还要执行字符串转换。
字符串转换:
-
当编译器观察到一个String后面跟着一个“+”,而这个“+”后面跟着一个非String类型的元素时,就会尝试着将这个非String类型好的元素转化为String(如果这个元素是一个对象,则执行这个对象的toString()方法)。例如:
//字符串拼接 System.out.println("hello "+"world!"); /* output: hello world! */ //字符串转化(user.toString()-->name:chaofan) System.out.println("hello:"+uer); /* output: hello:name:chaofan */
3.4 赋值
- 如果一个对象被引用,那么说明这个对象还有用。
- 如果一个对象没有了引用,那么这个对象会被“垃圾回收器”(GC)自动清理掉。
3.5 算术操作符
- 整数除法会直接去掉结果的小数位,而不会对结果四舍五入。
- Random类的对象可以生成随机数序列(计算机没有随机),构造器传入的参数叫做种子(seed),传入不同的种子会生成不同的随机数序列,通过该对象的nextInt()系列的方法来一个一个数字地取用,nextInt()方法也可以传入一个参数,代表取出随机数的范围,下面代码中的100就代表,要取范围为0-100(不含100)的序列中的下一个数字。如果种子一致,范围一致,那么Random的生成的随机数序列也会一致。
Random rand = new Random(47);
for(int i = 0;i < 10;i++){
System.out.print(rand.nextInt(100)+",");
}
/*
output:
58,55,93,61,61,29,68,0,22,7,
*/
3.5.1 一元加、减操作符
-
实际上就是广义上的正负号,它们的作用有两个:
- 标明数字的正负性;
- 将比int小的类型操作数提升为int类型。
3.8 逻辑操作符
“与”(||)、“或”(&&)、“非”(!)不能运用于非boolean表达式(表达式结果不为boolean类型胡或者非boolean类型的数据类型)。
3.8.1 短路
短路机制如果合理运用,那么就可以使逻辑表达式有一部分不必计算,那将获得潜在的性能提升。
3.9 直接常量
后缀
- 大写(或小写)的L,代表long。(一般大写)
- 大写(或小写)的F,代表float。
- 大写(或小写)的D,代表double。
前缀
- 0x(0X)后跟随0-9的数字或小(大)写的a-f的字母,代表十六进制数字。
- 0后跟随0-7的数字,代表八进制数字。
3.9.1 指数记数法
float f4 = 1e-43f;
编译器通常会将指数当作double处理,所以后面要尾随f,不然编译器会报错。
3.10 按位操作符
与:&
或:|
异或:^
非:~
- 按位操作符只能操作整数类型;
- 按位操作符可以与等号连用(~除外):&=等;
- 布尔类型不能按位“非”运算,为了和逻辑NOT区分(大概)。
3.11 移位操作符
- 移位操作符只能操作整数类型
左移位操作符(<<),向左按位移位,低位补0;
右移位操作符(>>),向右按位移位,高位补符号位。
另外,还有一种**“无符号”右移位操作符(>>>)**,无论正负,高位均补0。
- 对char、byte、short类型进行移位处理时,它们会先转化为int类型,并且移位结果也是int类型。
3.15 类型转化操作符
窄化转换:信息可能丢失,显式地强制转换。
扩展转换:信息不会丢失,无需显式转换。
- Java允许将任何基本数据类型转化为别的基本数据类型。
- 布尔类型不允许进行数据转换。
- “类”类型不允许进行数据转换。
- 对象只能在其所属泪珠之间进行类型转换。
3.15.1 截尾和舍入
- 将float或double转型为整数值时,总是截尾(二进制层面)。
- 如果想要进行数学意义上的四舍五入,那么需要使用java.lang.Math中的round()方法。
3.15.2 提升
如果对基本数据类型执行算数运算或者按位运算,如果比int小(即char、byte或short):
- 自动转换成int,再进行运算。
- 结果为int。
!