《Java编程思想》第4版
第3章 操作符
- 在最底层,Java中数据是通过使用操作符来操作的
- 3.1中提及了静态导入:就是导入类中的静态方法
import static java.lang.System.out
//这里就是静态导入System类中的静态方法out。所以程序中可以使用:
//说明类只有两种访问限制控制:包访问权限(如下);public
class staticPrint{
public static void main(){
out.println("由于静态导入,这里可以简写");
}
}
- 对象引用:这是需要强调的部分。对象引用存放在堆栈中,其指针指向对象的内存地址。而且将此对象实例无论复制给多少个对象引用,他们都是指向一个对象实例的。(代码中也用到了静态导入)
@后面的是对象内存地址,可以看出都是指向同一个对象的。
- 操作符有算术运算操作符、赋值操作符、自增自减操作符、关系操作符、逻辑操作符(包含短路)、按位操作符、移位操作符、字符串操作符、三元操作符、类型转换操作符
-
算术运算操作符:
1.注意其优先级,如果不能确定优先级的时候就尽量采用括号来确保优先级。
2.区分”/“(除号)和”%“(取模操作符)。除号直接取整数部分,取模是取余数。
3.new Random(47).nextInt(100):47是一个魔幻数字,其”47“作为random的种子,用于随机数生成器的初始值,随机数生成器会根据特定的种子值总是产生相同的随机数序列。nextInt以及其他兄弟们会生成以参数为上限值的对应类型的随机数。 -
赋值操作符、自增自减操作符
两者均是改变自身值的操作符,此类现象被称之为”副作用“。赋值操作符需要注意的是基本类型的赋值和引用对象的赋值的区别。
注意:可以使用+=来简化进行+操作后赋值的代码书写。 -
关系操作符
关系操作符包括:>、<、<=、>=、!=、== 。
!= 和 ==可以用于所有基本类型,其他的不能作用于布尔类型
值得注意的是判断对象是否相等时,一般不使用!= 和 ==。如果使用则判断的是内存地址。但是一般实际操作的时候,我们都是比较的两个对象的内容是否相等即可。所以判断对象是否相等一般使用重写的equals()方法。
注意:equals()源码中是用的 == 号,所以必须重写equals()以满足程序需求。
一般重写equals()方法,比较两个对象之间的内容即可。
字符串也需要使用equals,而且String.java中已经重写了equals()方法。
-
逻辑操作符
逻辑操作符左右两边的数据类型必须是布尔类型的。在Java中不能以数字来代表布尔类型(C中是可以的)。常用的关系操作符是”&&“(关系与)、”||“(关系或)、”!“(关系非)。
关系与只有左右都为true时才返回true,否则返回false。
关系或只有左右都为false是才会返回false,否则返回true。
关系非则取反,它是一元操作符。
这里有一个”短路“的概念需要理解。即是”&“和”|“。它们与”&&“、”||“的区别就是后者左右两边的关系式均要计算出结果,前者则不需要完全计算。例如”&“的左式子是false,则不用再进行右侧的计算即可返回false。
如果程序中尽量使用”短路“的话则会获得潜在的性能提升。 -
按位操作符
操作整数基本类型中的单个”比特“,即二进制就 。按位操作符仅使用了一个字符。
按位与”&“,执行的操作是两个对应的输入位都为1的时候返回1,否则就为0。
按位或”|‘,执行的操作是两个对应的输入位都为0的时候返回0,否则就为1。
按位非“~”,是一元操作符,是将输入位的数据取反。
按位异或“^”,执行的操作是两个对应输入位某一个是1,但另外的不全为1的情况下返回1,否则返回0。 -
移位操作符
操作的对象也是二进制的“位”。
左移操作符(<<):对应位向左移动对应位数,低位补0.
右移操作符(>>):对应位向右移动对应位数,正数高位补0,负数高位补1。
无符号右移操作符(>>>) :对应位向右移动对应位数,无论正负都在高位补0。
可以使用Integer.toBinaryString()将一个Integer数据以二进制的方式展现出来。
可以使用移位操作符提高某些代码运算速度,提高程序性能
上面的代码就展示了对一个正数进行次方计算的性能测试,由于代码运行速度快,无法使用毫秒级计算出时间差,所以采用System.nanoTime()采用纳秒级来计算时间差。得出结果这种计算采用移位运算比直接运算更快,性能更强。
-
字符串操作符
字符串操作符有“+”、“+=”。主要注意其“扩展转换”。如果操作符左右两侧某一个数据是字符串类型,就会尽量将其他数据转换为String类型的数据,然后进行拼接。
这里需要注意的是String、StringBuilder、StringBuffer的区别,后续会讲解 -
三元操作符
对于三元操作符可能用得不多,但它的确可以提高程序性能。
boolean-exp ? value0 : value1。表示?左边的式子返回true时值就为value0,否则为value1
上面代码可以看出来一些if-else的操作可以转换为三元操作符,性能所有提高
-
类型转换操作符
类型转换可以分为自动转换(扩展转换)和强制转换(窄化转换)。自动转换是无需在某一数据类型前加“(想转换的数据类型)”就可以自动识别转换类型,进行自动转换。强制转换就是需要加“(想转换的数据类型)”然后进行强制类型转换,此类转换方式会面临数据丢失的风险。
注意:类型转换必须是数据类型兼容
上面的代码int l = k就是进行了“自动转换”。而out中的部分就是强制转换。
窄化转换:将能够容纳更多数据信息的类型转换为无法容纳那么多信息的类型的时候就会面临数据丢失的风险。如下
参考书籍:《Java编程思想》
-