Java Puzzlers(1)

《Java Puzzlers》(中文译名《Java解惑》),一句话,好书,有趣,短小精悍的行文,主要是介绍JAVA编程一些必须注意小心的陷阱(trap)。第一章:表达式之谜,俺只记下一些有趣的例子,很多关于16进制的趣事不多说,反正尽量小心使用16进制。

1。对于精确答案的地方,要尽量避免使用float和double;对于货币计算,要使用int,long和BigDecimal,并且使用BigDecimal时千万不要使用BigDecimal(double)构造函数。,因为此构造函数将用它的参数的精确值来构建一个实例。

如:

public class Change {
    public static void main(String args[]) {
        System.out.println(2.00 - 1.10);
    }
}

我们希望打印0.9,可是打印的却是0.899999999999999,货币计算最好还是采用BigDecimal:

public class Change {
    public static void main(String args[]) {
        System.out.println(new BigDecimal("2.00").subtract(new BigDecimal(" 1.10")));
    }
}

2。长整除:当你操作很大的数字时,千万要提防溢出:

public class LongDivision {
    public static void main(String[] args) {
        final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
        final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;

        System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
    }
}

你猜测打印什么?1000?不,打印的是5。因为第一个MICRO_PER_DAY的计算完全是以int类型来进行,虽然计算结果是可以放进long的,但在放进之前已经溢出了。改为如此,显示地转为long:

  final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;

3。基本类型的转型操作:

public class Multicast {
    public static void main(String[] args) {
        System.out.println((int) (char) (byte) -1);
    }
}

输出可能让你很吃惊:65535。其实问题的关键是JAVA不显式区分有符号数与无符号数。在执行char的转换时,一条规则必须记住,如果最初的数值类型是有符号的,那么就执行符号扩展;如果它是char,那么不管它转化成什么类型,都执行零扩展。因为byte是有符号的类型,所以在-1转化为char时,发生符号扩展,作为结果的char的16位都被置位了,所以结果为2的16次方再加上-1。

4。使用条件操作符最好是使用类型相同的第二和第三操作数。请猜测下下面这个例子的输出结果:

public class DosEquis {
    public static void main(String[] args) {
        char x = 'X';
        int i = 0;
        System.out.print(true  ? x : 0);
        System.out.print(false ? i : x);
    }
}
你可能以为应该打印XX,可并非如此,结果是X88,why?这与条件操作符的规则有关:

A。如果第2和第三操作数的类型相同,那么它也是条件操作符结果的类型

B。如果一个操作数的类型是T(T包括byte,short,char)时,另一个操作数的类型是int的常量(注意是常量)表达式,并且可以用T类型表示,那么条件表达式的结果为T

C。否则,将对表达式的操作数进行二进制提升,结果即为提升后的类型。

因此第2个输出语句把X转为int型即88。很复杂对不?呵呵,所以还是最好使用相同类型吧!!

5。另一个需要注意的是复合操作符,如+=,*=,/+等,复合赋值表达式将自动把所执行计算的结果转化为其左侧变量的类型。所以要防止窄化转型。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
********Shenkxiao Resources******** 压缩包密码:shenkxiao 资源:Java解惑(中文版)、java puzzlers traps pitfalls,and Corner Cases 作者:Joshua Bloch Neal Gafter 版本:中文版 主要内容: Java解惑(英文版)—典藏原版书苑 目录 1 introduction 2 expressive puzzlers puzzle 1:oddity puzzle 2:time for a change puzzle 3:long pision puzzle 4:it s elementary puzzle 5:the joy of hex puzzle 6:multicast puzzle 7:swap meat puzzle 8:dos equis puzzle 9:tweedildum puzzle 10:tweedledee 3 przzlers with character puzzle 11:the last laugh puzzle 12:abc puzzle 13:animal farm puzzle 14:escape rout puzzle 15:hello whirled puzzle 16:line printer puzzle 17:huh? puzzle 18:string cheese puzzle 19:classy fire puzzle 20:what s my class? puzzle 21:what s my class,take2 puzzle 22:dupe of url puzzle 23:no pain,no gain 4 loopy puzzlers puzzle 24:a big delight in every byte puzzle 25:inclement increment puzzle 26:in the loop puzzle 27:shifty i s puzzle 28:looper puzzle 29:bride of loper puzzle 30:son of loper puzzle 31:ghost of looper puzzle 32:curse of looper puzzle 33:looer meets the wolfman puzzle 34:down for the count puzzle 35:minute by minute 5 exceptonal puzzlers 6 classy puzzlers 7 library puzzlers 8 classier puzzlers 9 more library puzzlers 10 advanced puzzlers a catalog of traps and pitfalls b notes on the illusions refereces index 本书深入研究Java编程语言及其核心类为的细微之处,特写95个有关Java或其他类库的陷阱和缺陷的谜题,其中大多数谜题都采用短程序的形式给出。在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上迥异的程序行为的简单解释的同时,更向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。本书附录部分列出了陷阱及缺陷的目录,可供读者进一学习参考。 本书以轻松诙谐的语言,寓教于乐的方式,由浅入深、总结归纳Java编程语言的知识点,适合具有Java知识的学习者和有编程经验的Java程序员阅读。 上传理由:精品典藏共享,网络上下载该资源太费劲,我来共享吧 因为是精品所以分数也比较高。 ***********************************
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值