day_03《Think in Java》读书笔记(操作符)
在最底层,Java中的数据是通过使用操作符来操作的
3.1 更简单的打印语句
多使用类库可以省去很多代码
3.2 使用Java操作符
基础中的基础,可以参考网上Java SE面试题针对性的提升
3.2 优先级
“+”需要考虑上下文环境,如果String “+”(其他类型),会尝试将其他类型转为String;
3.4 赋值
public class A {
int a;
}
class B{
public static void main(String[] args) {
A x=new A();
A y=new A();
x.a=5;
y.a=0;
System.out.println(x.a+"\t"+y.a);
x=y;//如果改为x.a=y.a;第三行结果为7 0
System.out.println(x.a+"\t"+y.a);
x.a=7;
System.out.println(x.a+"\t"+y.a);
}
}
//5 0
//0 0
//7 7
//x和y包含相同的引用,x=y时,将值为5的对象覆盖,被“垃圾回收”;
//别名现象
3.4.1 方法调用中的别名问题
class B {
char b;
}
public class A{
static void a(B y){
y.b='z';
}
public static void main(String[] args) {
B x=new B();
x.b='h';
System.out.println(x.b);
a(x);
System.out.println(x.b);
}
}
//h
//z
3.5算术运算符
➕=,➖=
Random类和其方法的使用
3.5.1 一元加、减操作符
一元减号用于转变数据;
一元加号将较小类型的操作数提升为int类型;
3.6 自增自减
前缀式:++a、–a 先自增,再运算
后缀式:a++、a-- 先运算,再自增
int a = 0;
for (int i = 0; i < 99; i++) {
a = a ++;
}
System.out.println(a);
//0
int b = 0;
for (int i = 0; i < 99; i++) {
b = ++ b;
}
System.out.println(b);
//99
Integer a = 0;
int b = 0;
for (int i = 0; i < 99; i++) {
a = a ++;
b = a ++;
}
System.out.println(a);
System.out.println(b);
//99
//98
3.7 关系操作符
等于和不等于适用于所有基本数据类型,其他不适用于boolean;
3.7.1 测试对象的等价性
==、!=适用于所有对象;结果为布尔值;
使用equals()方法比较两个对象实际内容是否相同;不适用与基本类型;
3.8 逻辑操作符
与&&、或||、非!
在应该使用String类型的地方使用了布尔值,布尔值会自动转换成适当的文本形式;
3.8.1 短路
&是java中的位逻辑运算:
例如:2&3=2;
2的二进制为10 ;3的二进制为11 ; 逻辑&之后为10
&&是boolean的逻辑运算
if((1> 2)&&(3> 1) )
表示如果两个条件都成立则执行之后的逻辑;
| 逻辑或
A|B,会对A, B都进行判断
||短路或
A||B,只有当A为假的时候才会对B进行判断。若A为真,则不继续对B进行判断。
3.9 直接常量
3.9.1 指数计数法
3.10 按位操作符
3.11 移位操作符
3.12 三元操作符
boolean ? 表达式1 : 表达式2
如果boolean为真,计算1,如果为假,计算2;
3.13 字符串操作符+和+=
3.14 操作符长犯错误
3.15 类型转换
类型转换(cast)
窄化转换:长转短;显式转换:int a= (int) 0.0;
拓展转换:短转长;隐式转换:float a= 5;
boolean不能转换,其他基本类型可以任意相互转换;
对象可以在其所属类族之间进型类型转换;
3.15.1 截尾和舍入
public class A{
public static void main(String[] args) {
double da=0.9d,db=0.1d;
float fa=0.9f,fb=0.1f;
System.out.println((int)da+"\t"+(int)db);
System.out.println((int)fa+"\t"+(int)fb);
}
}
//窄化操作时,自动执行截尾操作,输出结果为:
//0 0
//0 0
public class B{
public static void main(String[] args) {
double da=0.9d,db=0.1d;
float fa=0.9f,fb=0.1f;
System.out.println(Math.round(da)+"\t"+Math.round(db));
System.out.println(Math.round(fa)+"\t"+Math.round(fb));
}
}
//使用Math.round();方法可以执行舍入操作,是出结果为:
//1 0
//1 0
3.15.2 提升
在运运算过程中:表达式中出现对大的数据类型决定了最终结果的数据类型,如:long c = (int)a + (long)b;