操作符

赋值

Data a = new Data();
Data b = new Data();
b = a;

这里的赋值是把a的引用赋给b,a没有了引用会被垃圾回收器自动清理。

1.方法调用中的别名问题

把除基本类型(int, double, float…)外的对象(包括数组)传递给方法,则方法可以修改该对象,因为传递给方法的是这个对象的引用。但是基本类型的话不行。

测试对象的等价性

Integer n1 = new Integer(1);
Integer n2 = new Integer(1);
n1 == n2 ?  //false
n1 != n2 ?  //true

n1,n2是两个对象的引用。如果要比较的话,应该用n1.equals(n2);但是这个equals方法并不适用于基本类型

class MyData{
    int a;
}
MyData data1 = new Mydata();
data1.a = 1;
MyData data2 = new Mydata();
data2.a = 1;

data1.equals(data2);    //false

因为equals(object类的方法)方法默认的是比较引用,除非在自己的新类中重写equals方法,才能比较值。

移位运算符

  • 原码
  • 反码 除符号位以外,各位取反
  • 补码 反码+1
  • 移码 对补码的符号位取反
  • 阶码 在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码,阶码指明了小数点在数据中的位置。

计算机中浮点数的表示:

IEEE754标准

操作符_第1张图片

32位浮点数中,S是符号位,占1位,S=0表示正数,S=1表示负数。M是尾数,占23位。E是阶码,占8位,阶符采用隐含方式,即采用移码方法来表示正负指数。采用这种方式时,将浮点数的指数真值e变成阶码E时,应将指数e加上一个固定的偏移值127(01111111),即E=e+127;

一个规格化的32位浮点数x的真值为: x = (-1)^S * (1.M) * 2^(E-127)

64位浮点数中符号位1位,阶码域11位,尾数域52位,指数偏移值是1023。

一个规格化的64位浮点数x的真值为: x = (-1)^S * (1.M) * 2^(E-1023)

其中尾数域所表示的值是1.M。由于规格化的浮点数的尾数域最左位(最高有效位)总是1,故这一位经常不予存储。于是23位字段可以存储24位有效数。

移位运算符只能操作整数。
在java中(c/c++也是)如int等存的是数据的补码形式。


“<<”左移运算,能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)。

“>>”有符号的右移运算:
1. 符号为正,则在最高位插入0
2. 符号为负,则在最高位插入1

“>>>”无符号的右移运算:无论正负,都在最高位插入0;(c/c++中没有)

在c/c++中 true的值是1,false的值是0,if/while等的执行条件是非0,但是在java中boolean类型无法转换为int类型,if/while的条件必须是boolean类型的值。所以不会出现像if(a=1)这样的错误。

类型转换操作符

1.截尾与舍入

在java中,如果将浮点数,转换为整数,如 int a = (int)2.5; 总会截尾,只留下整数部分。若想用四舍五入的话,需要用到Math.round()方法。

你可能感兴趣的:(操作符)