Java的Integer cache
- Integer foo = 1000;
- Integer bar = 1000;
-
- foo <= bar;
- foo >= bar;
- foo == bar;
-
-
-
-
- Integer foo = 42;
- Integer bar = 42;
-
- foo <= bar;
- foo >= bar;
- foo == bar;
为什么会这样呢?你需要了解一下Java Interger Cache,下面是相关的程序,注意其中的注释
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public static Integer valueOf(int i) {
- if(i >= -128 && i <= IntegerCache.high)
- return IntegerCache.cache[i + 128];
- else
- return new Integer(i);
- }
Java的异常返回
请看下面这段程序,你觉得其返回true还是false?
- try {
- return true;
- } finally {
- return false;
- }
在 javascript 和python下,其行为和Java的是一样的。
错误1:长整数赋值问题
系统有一个功能要产生邀请码,客户通过邀请码进行注册,但是邀请码要有过期时间,希望60天后过期,过期时间采用毫秒数:
- long EXPIRED_DATE = 60 * 24 * 60 * 60 * 1000;
可是,测试人员告诉我,邀请码10天不到就过期了,我看了代码,百思不解,最后跟踪了代码,才发现
引用
60 * 24 * 60 * 60 * 1000
并不会自动转化为long,而是一个int,10天的毫秒数就超过了int的最大值了,因此10天不到就过期了!
这儿犯下的错误是其实对 “整数字面值赋值时默认为int型”这个基础Java知识的忽视造成的.如果要让JVM将字面数字当成long,则必须在字面数字后显示加L标识,所以这个BUG是这样解决的:
- long EXPIRED_DATE = 60 * 24 * 60 * 60 * 1000L;
错误2:数值越界的问题
我写的一个模块允许开发者注册插件,为了控制插件执行的先后顺序,因此我写了一个Orderable接口,插件实现该接口以决定执行的先后顺序(orderNo越小越先执行):
- public interface Orderable {
-
-
-
- int getOrdreNo();
- }
然后写了一个Comparator,以便可以通过java.util.Collections的
- sort(List<T> list,Comparator<? super T> c)
对插件List进行排序。Comparator是这样写的:
- public class OrderableComparator implements Comparator {
- private static OrderableComparator intance = new OrderableComparator();
-
- private OrderableComparator() {
- }
-
- public int compare(Object obj1, Object obj2) {
- int order1 = Integer.MAX_VALUE;
- int order2 = Integer.MAX_VALUE;
- if (obj1 instanceof Orderable) {
- order1 = ((Orderable) obj1).getOrdreNo();
- }
- if (obj2 instanceof Orderable) {
- order2 = ((Orderable) obj2).getOrdreNo();
- }
- return order1 - order2;
- }
-
- public static OrderableComparator getIntance() {
- return intance;
- }
- }
但是一个兄弟咆哮地告诉我,它的插件的getOrderNo()已经设置为Integer.MIN_VALUE,但是却在最后一位执行!!!
跟踪了代码,才发现是对数值越界问题的忽视而造成了这个低级错误,下面具体分析一下,如Plugin1的getOrdreNo()为Integer.MIN_VALUE,而Plugin2的getOrdreNo()为1,可是大家想想下面的计算值是多少呢?
是2147483647!!
找到问题后改起来是不费工夫的:
- public int compare(Object obj1, Object obj2) {
- int order1 = Integer.MAX_VALUE;
- int order2 = Integer.MAX_VALUE;
- if (obj1 instanceof Orderable) {
- order1 = ((Orderable) obj1).getOrdreNo();
- }
- if (obj2 instanceof Orderable) {
- order2 = ((Orderable) obj2).getOrdreNo();
- }
-
- if(order1 > order2){
- return 1;
- }else if(order1 < order2){
- return -1;
- }else{
- return 0;
- }
- }
分享到:
相关推荐
1. **BaiduTiebaFaKuang.exe**:这是主应用程序文件,通常是一个可执行程序,用户可以通过运行这个文件来启动"找乐儿-百度贴吧发狂 v1.0"软件。 2. **chinaz.com说明.txt**:这可能是一个来自知名网站Chinaz(站长...
编一棋盘游戏程序,可以选择人机对战和双人对战两种游戏模式,而人机模式下可以选择三种电脑等级,即简单的电脑、中等的电脑和令人发狂的电脑,电脑智能化程度随等级提高而提高。下棋双方分别以字符X和字符O为棋子。...
ActionScript 3作为一款高级编程语言,具有面向对象的特性,能够高效地处理多媒体和网络通信。在本游戏中,AS3的灵活性和强大的控制能力得到了充分展现,尤其是在处理复杂的逻辑判断和动画效果上。 #### 四、总结 ...
- “名词+self”:如“beauty's self”(美的化身)、“pity's self”(极令人遗憾的事物)等,这种用法赋予了“self”一种象征意义。 在搭配和句型中,“self”有多种使用方式,例如: - “动词+self”:如...
标题中的“方便快捷通讯录”指的是这样一类应用,它能够帮助用户快速、高效地管理联系人信息,实现便捷的通信。这类应用通常具有多种功能,如分类管理、搜索查找、同步更新等,极大地提高了人们处理社交关系的效率。...
SSH框架,全称为Struts2、Hibernate和Spring的集成,是Java Web开发中常见的三大开源框架的组合。这个整合框架提供了强大的模型-视图-控制器(MVC)架构支持,数据库操作以及依赖注入等特性,极大地提高了开发效率和...
MyBatis逆向工程是开发过程中一个非常实用的特性,它可以帮助我们自动化生成与数据库表相关的Java接口、Mapper XML文件以及实体类,极大地提高了开发效率。`generatorSqlmapCustom`是MyBatis逆向工程的一个自定义...
升级到win10后,很多更新还是特别喜欢的,但有一些更改有违以往的操作习惯,也到了让人发狂的地步,比如输入法切换,需要win+空格,特别不习惯,特别是对于it从业者更是如此,因为默认是中文输入法,大家都懂的 ...
短语如"be/get/go mad" 意为“发狂,失去理智”,"drive sb mad" 表示某事使人极度烦躁,“Mum went mad when she heard the noise.”(妈妈听到噪音时很生气。) 3. **Magazine**:杂志,名词,指定期出版的印刷...
例如,将原文中的词语替换为成语,可以使句子更具文学色彩,如“风和日丽”代替“天气不错”,“欣喜若狂”代替“高兴得快要发狂”,“早出晚归”描述父亲辛勤工作,“筋疲力尽”描绘疲劳状态,“人山人海”形容人群...
【高中英语常见名词词汇解析】 在高中英语学习中,掌握常见的名词词汇至关重要,因为它们是构建句子和表达思想的基础。以下是一些关键的名词及其...同时,了解这些词的不同搭配和短语将大大提升语言的丰富性和准确性。
相当有趣的名字大战,模拟迅雷等游戏制做,有击晕,发狂等攻击。奇乐无穷。
ng-grunt-karma-starter ng-grunt-karma-starter 它是带有业力单元测试的角度应用模板。 Grunt用于开发。 运行该应用程序grunt
这就是为什么我制作了这个令人发狂的模块以自动关闭连接的原因。 我在Debian上构建了这个东西,但是无法连接。 我不相信它无法连接,所以我在Windows上完成了测试。 因此,我们稍后会看到什么。 因为瞧瞧,它可以...
驰骋畋猎,令人心发狂。」 在这里,老子讲述了感官的限制。老子认为,感官是有限的,它们不能完全地感知宇宙。 第十三章:宠辱若惊 老子曰:「宠辱若惊,贵大患若身。何谓宠辱若惊?」 在这里,老子讲述了「宠」...
crazy/mad"(使人发疯/发狂)等,这些表达方式能够增强学生的语言表达能力,使他们能更生动地描绘情感状态。同时,"the more…the more…"这样的句型训练,有助于学生掌握比较级的用法。 Section B中,新增了一些...
2. 使人发疯/发狂:drive sb. crazy/mad 3. 越...越...:the + 比较级 + ...,the + 比较级 + ... 4. 成为某人的朋友:become friends with sb. 5. 忽略/不考虑:leave out 课堂活动包括听前预测、听中理解和听后...
在 C 语言中,结构体是一种复杂的数据类型,可以包含多个成员变量。结构体的声明格式为 `struct {成员变量列表} 结构体名;`。例如,`struct { int x, y; } x;` 声明了一个名为 `x` 的结构体,拥有两个成员变量 `x` ...
这些成语不仅仅是文字游戏,它们背后蕴含的丰富情感和人生哲理,是孩子们在学习过程中需要理解和体会的,有助于提高他们的语言素养和文化修养。通过掌握这些成语,小学生可以更好地表达自己的情绪,同时也能够更好地...