- 浏览: 467153 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (272)
- java基础 (59)
- struts (8)
- spring (8)
- 数据库 (8)
- java 网络编程 (29)
- hibernate (3)
- JavaScript (10)
- 日志管理 (2)
- jsp (4)
- servlet (7)
- xml (4)
- ajax (2)
- web service (4)
- 算法与数据结构 (13)
- java 反射机制 (11)
- java 泛型 (3)
- java I/O (8)
- java 线程 (12)
- JavaEE (6)
- java解惑 (33)
- 工具 (5)
- MyEclipse编程实践 (1)
- OSGI (2)
- 设计模式 (9)
- 正则表达式 (0)
- EJB (3)
- Ubuntu linux (6)
- Android (1)
- web前端 (2)
- 找工作 (1)
- SCA (1)
- maven (1)
- 缓存 (1)
- json (1)
- javamail (1)
- 工作笔记 (2)
最新评论
-
霜花似雪:
博主可以分享一下源码吗?
使用maven构建web项目实例 -
王庆波-行:
很好的demo!
memcache使用实例 -
surpassno:
大写的牛逼
java可视化显示内存使用情况 -
zhulin0504:
怎么访问NetEcho.html页面呀???
applet与servlet的网络通信 -
springdata:
java多线程实例demo源代码下载:http://www.z ...
java多线程例子
问题1:判断整数是否是奇数
问题2:小数运算
并不是所有小数都可以用二进制浮点数准确表示
一定使用的是BigDeciaml(String)的构造器,而不是BigDeciaml(double)
总之,在需要精确答案的地方,不要使用float和double
问题3:长整除
因为是按照int运算的,两个int相乘,结果为int型,溢出了。
修改如下:即可打印预期结果
final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
教训:当操作很大的数字时,千万要提防溢出。
问题4:初级问题
问题3是除法,比较复杂,下面的例子只涉及加法,结果如何呢?
一定以为打印出66666,而结果是17777,请认真注意第二个操作数为5432l,是一个long型数。教训:在long类型字面常量中,一定要用大写的L,不要用小写的l,容易与1混淆。还要避免用单个l做变量名
问题5:十六进制的趣事
看似应打印出1cafebabe,但结果是cafebabe。为何?
所有的十进制字面常量都是正数,如果想写一个负的十进制,则需要在正的十进制字面常量前加上“-”即可。但是,十六进制或八进制字面常量可就不一定是正数或负数,是正还是负,则要根据当前情况看:如果十六进制和八进制字面常量的最高位被设置成了1,那么它们就是负数。
该程序执行的加法是一个混合类型的计算:左操作数是long型,而右操作数是int类型。为了执行该计算,Java将int类型的数值用拓宽原生类型转换提升为long类型,然后对两个long类型数值相加。因为int是有符号的整数类型,所以这个转换执行的是符号扩展。
这个加法的右操作数0xcafebabe为32位,将被提升为long类型的数值0xffffffffcafebabeL,之后这个数值加上了左操作0x100000000L。当视为int类型时,经过符号扩展之后的右操作数的高32位是-1,而左操作数的第32位是1,两个数值相加得到了0:
0x 0xffffffffcafebabeL
+0x 0000000100000000L
-----------------------------
0x 00000000cafebabeL
如果要得到正确的结果0x1cafebabe,则需在第二个操作数组后加上“L”明确看作是正的long型即可,此时相加时拓展符号位就为0:
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));//1cafebabe
最好避免混合运算
public static boolean isOdd(int a){ return (a%2)!=0; // return (a&1)!=0; 性能优化 // return (a%2)==1; 不可,负奇数的余数是-1 }
问题2:小数运算
System.out.println(2.00-1.10); //0.8999999999999999解释:1.1不能被准确表示为一个double,因此被表示为最接近它的double值。
并不是所有小数都可以用二进制浮点数准确表示
System.out.printf("%.2f%n", 2.00-1.10); //0.90 System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10"))); //0.90
一定使用的是BigDeciaml(String)的构造器,而不是BigDeciaml(double)
总之,在需要精确答案的地方,不要使用float和double
问题3:长整除
public class Main { public static void main(String[] args) { final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;// 86400000000 final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000 ; System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);// 5 } }
因为是按照int运算的,两个int相乘,结果为int型,溢出了。
修改如下:即可打印预期结果
final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
教训:当操作很大的数字时,千万要提防溢出。
问题4:初级问题
问题3是除法,比较复杂,下面的例子只涉及加法,结果如何呢?
System.out.println(12345+5432l);
一定以为打印出66666,而结果是17777,请认真注意第二个操作数为5432l,是一个long型数。教训:在long类型字面常量中,一定要用大写的L,不要用小写的l,容易与1混淆。还要避免用单个l做变量名
问题5:十六进制的趣事
System.out.println(Long.toHexString(0x100000000L+0xcafebabe));
看似应打印出1cafebabe,但结果是cafebabe。为何?
所有的十进制字面常量都是正数,如果想写一个负的十进制,则需要在正的十进制字面常量前加上“-”即可。但是,十六进制或八进制字面常量可就不一定是正数或负数,是正还是负,则要根据当前情况看:如果十六进制和八进制字面常量的最高位被设置成了1,那么它们就是负数。
该程序执行的加法是一个混合类型的计算:左操作数是long型,而右操作数是int类型。为了执行该计算,Java将int类型的数值用拓宽原生类型转换提升为long类型,然后对两个long类型数值相加。因为int是有符号的整数类型,所以这个转换执行的是符号扩展。
这个加法的右操作数0xcafebabe为32位,将被提升为long类型的数值0xffffffffcafebabeL,之后这个数值加上了左操作0x100000000L。当视为int类型时,经过符号扩展之后的右操作数的高32位是-1,而左操作数的第32位是1,两个数值相加得到了0:
0x 0xffffffffcafebabeL
+0x 0000000100000000L
-----------------------------
0x 00000000cafebabeL
如果要得到正确的结果0x1cafebabe,则需在第二个操作数组后加上“L”明确看作是正的long型即可,此时相加时拓展符号位就为0:
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));//1cafebabe
最好避免混合运算
发表评论
-
数据库及struts面试题
2011-06-22 11:07 1058数据库部分 Q: What is SQL? ... -
EJB面试题
2011-06-22 10:54 1124Q: What are the different kinds ... -
java中的servlet面试题
2011-06-22 10:43 1108Q: Explain the life cycle metho ... -
java中JSP的面试题
2011-06-22 10:22 1541Q: What is a output comment? (可 ... -
java中的集合面试题
2011-06-22 10:12 719Q: What is the Collections API? ... -
彻底搞清楚java的内部类
2011-06-15 10:47 1503内部类允许在一个类中 ... -
细说java(java中的浮点数十六进制表示)
2011-06-12 16:48 3562java中浮点数不能用八进制表示,但可以用十六进制表示,只能用 ... -
SCJP试题
2011-06-09 16:14 1173package scjp; public class T ... -
java面试题解惑 之 继承、多态、重载、重写
2011-06-03 09:36 1297继承、多态、重载、重写 继承 java中有三种类:类,抽象类, ... -
java面试题解惑 之 多线程
2011-06-02 17:24 9891,多线程 线程或者说 ... -
java面试题解惑 之变量初始顺序,变量覆盖,字符串池,final,finally区别
2011-06-02 16:26 7971,变量初始化顺序 package com.qdu.sun; ... -
java解惑(Map的使用,静态导入方法,线程中断interrupted与线程死锁)
2011-05-17 12:38 1395Map的使用 package other; import ... -
java 继承的一个问题(想不明白)
2011-04-13 17:03 914java中的继承问题,以为是学会了java,结果最简单的一个j ... -
java解惑(谜题76。。)
2011-03-09 11:22 1220谜题76:乒乓public class PingPong { ... -
java解惑(谜题60,65)
2011-03-08 15:52 917一行以毙之 1,编写一个 ... -
java解惑(谜题66。。。)
2011-02-28 20:54 950谜题66:一件私事 class Base{ public ... -
java解惑(谜题61。。。)
2011-02-28 20:17 914谜题61:日期游戏 import java.util.Cal ... -
java解惑(谜题56到。。库之谜)
2011-02-28 19:41 857谜题56:大问题 import jav ... -
java解惑(谜题49。。)
2011-02-27 10:52 953谜题49:比生命更大 import java.util.Cal ... -
java解惑(谜题41到谜题)
2011-02-27 10:18 919谜题41:域和流 下面的 ...
相关推荐
总结,Java编程中的谜题涵盖了许多方面,从基础语法到高级特性,每一个谜题都是提升编程技巧的机会。通过深入学习和实践,你可以逐一解开这些谜题,成为一名更优秀的Java开发者。不断探索和理解Java的内在机制,将使...
我整理出来的Java解惑/谜题的CHM版本,包括目录、全文搜索和收藏夹。比目前Word/PDF版本的多个目录,比TXT版本的多一些格式。-- 如果不能打开CHM,请按下面方法解决:-- 右键点击chm文档,查看属性,可以看到...
#### 谜题1:奇数性的判断 在《JAVA解惑》一书中,作者通过一系列实例介绍了Java编程语言中的一些不易掌握的知识点。其中一个例子是关于如何正确判断一个整数是否为奇数。 **原始代码分析** ```java public static ...
《Java解惑》是一本专为Java程序员设计的书籍,旨在揭示编程中常见的陷阱、误解和易犯的错误。这本书的中文版使得更多的中国开发者能够深入理解这些“谜题”,提高编程技能。Java Puzzlers是由Java之父James Gosling...
文档《java解惑 PDF版》中列举了95个这样的谜题,每个谜题都旨在帮助开发者理解并纠正一些常见的错误理解。以下是根据提供的部分内容解析的几个相关知识点。 ### 表达式谜题与取余操作符(%)的行为 在Java中,...
### Java解惑 书籍类 谜题 #### Java谜题1——表达式谜题 **谜题1:奇数性** 本节讨论了一个看似简单的Java方法,旨在判断一个整数是否为奇数: ```java public static boolean isOdd(int i) { return i % 2 ==...
在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上迥异的程序行为的简单解释的同时,更向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。 本书以轻松诙谐的语言,寓教于乐的方式,由浅入深、...
Java谜题1——表达式谜题 谜题1:奇数性 谜题2:找零时刻 谜题3:长整除 谜题4:初级问题 谜题5:十六进制的趣事 谜题6:多重转型 谜题7:互换内容 谜题8:Dos Equis 谜题9:半斤 谜题10:八两 Java谜题2...
### JAVA面试谜题解惑知识点解析 #### 表达式谜题:奇数性检查方法的缺陷 **题目背景:** 题目中提到的谜题旨在检验面试者对Java中的基本数学运算符及其行为的理解程度。具体来说,是针对取余运算符`%`在处理整数...
该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...
本书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...
【Java解惑PPT1】深入探讨Java编程中的常见迷惑 在Java编程中,了解语言的细微之处至关重要,因为这可能会导致意想不到的行为。本PPT主要涵盖了五个有趣的Java谜题,帮助开发者理解Java的一些核心概念。 **谜题1:...
Java Puzzlers 中文版(Java解惑) Java 谜题 1——表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转 吗? public static boolean isOdd(int i){ return i % 2 == 1...
《Java解惑》是一本由Google工程师编写的经典教材,旨在帮助开发者解决在实际编程过程中遇到的困惑和误解。这本书通过一系列精心设计的“Java谜题”,揭示了语言中的一些不直观特性和陷阱,从而提升读者对Java深层...
谜题1:奇数性 在这个问题中,我们有一个方法`isOdd(int i)`,它通过检查`i % 2`是否等于1来判断一个整数是否为奇数。然而,这个方法在处理负数时会出现问题,因为Java中的取余运算符 `%` 对于负数的处理方式可能...