读<<Java解惑>>后的碎嘴子(第三章)

1 篇文章 0 订阅
1 篇文章 0 订阅
第三章--循环问题

24.
for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++) {
	if (b == 0x90)
	System.out.print("Joy!");
}
结果是什么也没打,不要被迷惑,十六进制的90虽然是8位,产生了byte本身也是8位能装下不溢出的错觉,但是byte作为有符号整数表示范围是-128~127,负数最高位是1
总结:本身没有什么特别的,但本条内容再现了bloch大师最具特色的头脑风暴

25.
int j=0;
for(int i=0;i<100;i++)
   	j = j++;
System.out.println(j);

结果是0而不是100,这个猛一看还是挺糊弄人的,其实本质把j++当作一个表达式看就明白了,它永远会返回未自增前的0值,这样重复了100次,把j++改成++j肯定可以解决,但是IDE会嘲笑你在做一个很二的操作
总结:再基础的东西都会使人犯错,不要小看这些基本元素

26.
int count = 0;
for(int i=Integer.MAX_VALUE-100; i<=Integer.MAX_VALUE; i++)
       count++;
System.out.println(count);
结果是100?还是101?结果是死循环,原因很简单,当i被加成Integer.MAX_VALUE时,再加一次就溢出了,直接变成了Integer.MIN_VALUE,如此往复
总结:不要打这些边界值的想法

27.
int i = 0;
while (-1 << i != 0)
   	i++;
System.out.println(i);

结果是32?结果还是死循环,int的-1二进制表示是32个1,当i==32时-1<<32的结果是-1而不是0,原因就一句,任何类型不可能移走和原类型本身一样的位数(如int型不能移动32位,最多31位,long不能移动64位,最多63位)
总结:bit位移什么的,最讨厌了

28.
while(i==i+1){}

i为何值,死循环成立?答案有很多,之一是无穷大的浮点数如Double.POSITIVE_INFINITY,按照数学的说法无穷大+1还是无穷大,按照大师的说法则是当一个浮点数足够大,在其上加减值是可能不会影响返回值的,这想想是可以理解的,不能把思考整数的习惯思维用在浮点数上
总结:二进制浮点数只是返回近似值

29.
while(i != i){}

i为何值,死循环成立?答案是Double.NaN,一句话它不等于任何值,包括它自己
总结:在含0乘除计算中,尤其是除数或者被除数有0,或0.0时,根据int和double等参与类型,会相应返回Double.POSITIVE_INFINITY,Double.NaN等值,放在实际业务方法里带来的bug足以让你喝一壶(这个曾经可是有着深刻的体会)

30.
while (i != i + 0) {}

i为何值,死循环成立?附加条件是i不能是float或double,答案是任何字符串,这样+符号会被重载,数字0也会被当作字符串从而和i拼接到一起
总结:大师也懂得轻松一刻

31.
while (i != 0) {
	i >>>= 1;
}

i为何值,死循环成立?答案是任何short,byte的负数,如short i = -1,二进制为16个1,重点在于short,byte,char进入循环会有一个神奇的int转换,i会被当作32个1来操作,经过无符号右移最高位变成了0,然后赋值回i(别忘了i是short类型),所以还会有一次窄化赋值,只保留了后16位,等于还是16个1,被右移的高16位被无情的扔掉了
总结:不要在short,byte,char上执行这样的复合赋值,小心自动窄化

32.
while (i <= j && j <= i && i != j) {}

i为何值,死循环成立?答案是任何基本包装类型,如Integer i = new Integer(0);Integer j = new Integer(0);不过当然只限于5.0版本以后,这里auto-boxing在起作用,当遇到<=这样的比较符号时,会自动将对象解包成基本类型,

这样前两个表达式为true,但是当遇到==或!=时便不会解包,比较将是内存位置,毕竟Integer是new出来的,这样i!=j会返回true
总结:如果改成Integer i = 0;Integer j = 0;i!=j还成立吗?大师对于new是否存在,使用值相等或引用相等的规律并没有作头脑风暴,自行参考auto-boxing内部原理吧

33.
while (i != 0 && i == -i) {}

i为何值,死循环成立?答案是Integer.MIN_VALUE或Long.MIN_VALUE,为什么没有byte和short?关键还是自动转型,本条在大师的叙述中还有很多值得学习思考的地方
总结:一元减号操作符用在一个非数值型上是非法的,没有任何浮点数等于其符号位反转之后的值,牢记有符号整数采用的是补码计算法,以及各个整数表示范围中,负数比正数要多一个,因为0被排除了,这样多出来的那个负数便有了其特殊性

34.
int START = 2000000000;
int count = 0;
for (float f = START; f < START + 50; f++)
         count++;

完毕后count会是什么呢?这一看就是有问题的,谁也不会使用float作为循环索引,根据原来的经验,浮点数足够大,加1并不会使它改变,所以答案是死循环吗?答案是0,循环没有执行,因为f < START + 50不成立,很简单,f并不是2000000050
总结:可以顺便复习一下for的执行顺序,float和short这样的东西,除非特殊环境下(嵌入式?),否则不应该出现在的任何应用里了

35.
int minutes = 0;
for (int ms = 0; ms < 60*60*1000; ms++){
if (ms % 60*1000 == 0)
	minutes++;
   }
完毕后minutes会是什么呢?答案是60000,大师不教你也能看出来了,取余(%)的优先级和乘法(*)优先级是一样的,顺序会从左到右计算
总结:不要吝啬用括号,最后一条让你从无数个死循环中轻松一下,总体本章还是比较有意思的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值