读《Java解惑》的心得<一>
1.当取余操作返回一个非零的结果时,它与左操作数具有相同的正负号。例子:判断奇偶数。
2.并不是所有的小数都可以用二进制浮点数精确表示,比如0.1 0.01 和其他任何负次幂,还有10也是。二进制浮点对于货币计算是非常不合适的。解决办法就是改变单位,从而是浮点数变成整数,还可以用new BIg Decimal(String)构造器,而千万不要用Big Decimal(double)。后一个构造器将用他的参数的精确值来创建一个实例,相当于还是前面讲的那个问题!
3.final long MICROS_PER_DAY=24606010001000,在运算过程中会被当成是int型,所以结婚会溢出,解决办法就是在第一个数后面跟着一个L说明它是LONG型的运算。所以当很大的数字参与运算时,就要提防有溢出。
4.如果最初的数值类型是有符号的,就执行符号扩展,如果他是char那么不管它将被转换成什么类型,都执行零扩展。
5.混合类型的计算可能会产生混淆,这是因为会自动的拓宽较窄的那一个操作数,即进行符号扩展,十六进制和八进制字面常量无需显示的减号就可以表示负的值,所以最好避免混合类型的计算。
6.当且仅当+操作符的操作数中至少有一个String类型时,才会执行字符串连接操作。否则,执行加法运算。
7.当将一个char数值传递给println方法会打印一个Unicode字符而不是它的数字代码!char数组也是这样!String. valueOf,StringBuffer.append的char[ ]重载版本的行为也是类似的。然而在这些方法中没有定义字符串连接操作符。该操作符被定义为先对它的两个操作数执行字符串转换,然后连接所产生的两个字符串。对 包含数组在内的对象引用 的字符串转换定义如下:如果应用为null,将其转换成字符串"null"。否则该转换的执行就像无参数调用该引用对象的toString方法一样,但是如果调用toString方法的结果本来就是null,那么就用字符串"null"来代替。而数组是从Object那里继承的toString方法,这个方法返回的是"返回一个字符串,它包含了该对象所属类的名字,‘@’符号以及表示对象散列码的一个无符号数十六进制整数。
8.String的编译期常量是内存限定的,换句话说,任何两个String类型的长常量表达式,如果指定的是相同的字符序列,那么它们就用同一个对象引用表示,这是用==去判断他们的结果就是ture。
9.== 操作符并不是测试两个对象是否相等,而是两个对象的引用是否相同,换句话说,它测试这两个对象引用的是否正好引用同一个对象。应该使用equals方法。