Java解惑三:循环之谜

谜题24

byte是有符号的,范围是-128 - 127。而0x90是int类型。比较的时候,不相等。

如果想让其相等,需要进行类型转换:(byte & 0xff) 或者 (byte)0x99。

谜题25

自增运算符对循环的影响。j = j++,先赋值。

谜题26

Integer.MAX_VALUE加一之后会变成Integer.MIN_VALUE,这对循环会有影响。

可以考虑使用long来表示i变量,或者使用效率更高的i != Integer.MAX_VALUE。

谜题27

(-1 << 32)的结果是-1而不是0。

对于int型的数据移位运算总是取右端数转换成2进制的低五位。

对于long型的数据移位运算总是取右端数转换成2进制的低六位。

32取低五位是0,因此结果是-1。

如果右边的数是负数,同样保留低五(六)位,将其转换为正数。

谜题28

while(i == i + 1) {

}

当浮点数i足够大时候, i = i + 1。

相邻浮点数之间的距离被称为ulp(unit int the last place),一旦ulp超过2,加一将不会产生任何影响。

二进制浮点数算术只是一种近似。

谜题29

while(i != i) {

}

IEEE 754浮点算术保留了一个特殊的值:NaN(not a number)。

double i = 0.0 / 0.0,double i = Double.NaN,

任何浮点数操作,只要一个或多个操作数为NaN,那么结果是NaN。

NaN不等于任何浮点数,包括它自身。NaN  != NaN 。

谜题30

while(i != i + 0) {

}

i != i + 0,如果i是String类型。此时的+就不是算术加号了,被重载为字符串的连接。

谜题31

while(i != 0) {

i  >>>= 1;

}

还是在讲类型转换。

当i为short类型的-1的时候,i >>>= 1,仍旧是-1:首先将short转换为int,然后在截取低位16。

short,byte的任何负数最终都会转换为-1。而char不会,char是无符号的。

谜题32

Integer i = new Integer(0);

Integer j = new Integer(0);

while(i <= j && i >= j && i != j){

}

包装类,当使用==运算符时候,并不是判断值相等,而是引用(兼容性考虑)。<=或者>= 都是值判断。

谜题33

while(i != 0 && i == -i) {

}

整数的边界问题

0x8000 0000 表示最小的负数(Integer.MIN_VALUE),对其求相反数,仍是其本身。

谜题34

		final int START = 2000000000;
		int count = 0;
		for (float f = START; f < START + 65; f++) {
			count++;
			System.out.println(START + 65);
		}
浮点数精度问题

START+50与START相等,当使用浮点数表示的时候。50比START的ulp距离(128)的一半还小。当超过ulp的距离的一半的时候,无限循环。

谜题35

取余和乘除具有相同的优先级。

Java解惑三:循环之谜

时间: 2024-11-05 14:49:08

Java解惑三:循环之谜的相关文章

java解惑之字符之谜(谜题22)

谜题22:URL的愚弄 本谜题利用了一个java编程语言中一个鲜为人知的特性.请考虑下面的程序将会做什么? public class BrowerTest{ public static void main(String[] args){ System.out.ptintln("iexplore"); http://www.google.com; System.out.println(":maximize"); } } 这是个有点诡异的问题.当我们初次看到这个程序时,

java解惑之字符之谜(谜题16)

谜题16:行打印程序 行分隔符是为分割文本行的字符或字符串而起的名字,并且在不同平台上它是存在差异的.在windows平台上,它由CR字符(回车)和紧随其后的LR(换行)字符组成.在UNIX平台上,通常引用单独的LF字符作为换行字符.那么,这次的谜题也就由行分隔符引出,来看看下面这个将LF字符传递给println方法的程序会打印什么,它的行为是否依赖于平台? public class LinePrinter{ public static void main(String[] args){ //N

java解惑之字符之谜(谜题20)

谜题20:我的类是什么 来看一个打印其类文件名称的程序: package com.javapuzzlers; public class Me{ public static void main(String[] args){ System.out.println(Me.class.getName().replaceAll(".","/") + ".class"); } } 这个程序是先获得它的类名("com.javapuzzlers.Me

java解惑之字符之谜(谜题21)

谜题21:我的类是什么?镜头2 下面的程序所要做的事情正是前一个谜题所做的事情,但是它没有假设斜杠符号就是分隔文件名组成部分的符号.相反,该程序使用的是java.io.File.separetor,它被指定为一个公共的String域,包含了平台相关的文件名分隔符.这个程序会打印正确的.平台相关的类文件名吗?该程序是从这个类文件中被加载的. package com.javapuzzlers; import java.io.File; public class MeToo{ public stati

java解惑之字符之谜(谜题18)

谜题18:字符串奶酪 下面这个程序从一个字节序列创建一个字符串,然后迭代遍历字符串中的字符,并将它们作为数字打印.请描述程序打印的数字序列: public class StringCheese{ public static void mian(String[] args){ byte bytes[] new byte[256]; for(int i = 0; i < 256; i++){ bytes[i] = (byte)i; } String str = new String(bytes);

Java解惑七:更多类之谜

谜题66 继承的问题. 对于实例方法:命名相同时,子类会覆写父类的方法,且访问权限至少和父类一样大. 对于域:命名相同时,子类会隐藏父类的域,且访问权限任意. 谜题67 不要重用库中的类名. 谜题68 命名的问题. 类名应该以大写字母开头,形式为:MixedCase. 变量以小写字母开头,形式为:mixedCase. 常量以大写字母开头,形式为:MIXED_CASE. 单个大写字母,只能用于类型参数,形式为:Map<K, V>. 包名应该都是小写,形式为:lower.case. 当一个变量和一

Java解惑五:类之谜

本文是依据JAVA解惑这本书,做的笔记.电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题46 函数重载的问题. JAVA重载解析过程:1. 选取全部可用的方法或者构造器:2. 从过程1中选取的方法或构造器中选择最精确的. 一般而言:能够强制要求编译器选择一个精确的重载版本号,将实參转型为形參所声明的类型. 谜题47 继承中静态域的问题. 静态域由声明它的类及其全部子类共享. 假设须要让每个子类都具有某个域的单独拷贝,必须在每个子

Java解惑八:更多库之谜

本文是根据JAVA解惑这本书,做的笔记. 电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题76 将线程的启动方法start(),写成了run(); PS:管程(monitor)锁有待进一步理解. 谜题77 线程中锁的问题. 理解不深刻. 谜题78 反射会造成访问其他包中的非公共类型的成员,引起运行期异常. 谜题79 遮蔽:Thread.sleep()方法遮蔽了自定的方法. 谜题80 反射:如何实例化非静态内部类以及静态内部类.

Java解惑六:库之谜

本文是根据JAVA解惑这本书,做的笔记. 电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题56 BigInteger.BigDecimal以及包装类型的实例是不可改变. BigInteger five = new BigInteger("5"); BigInteger total = BigInteger.ZERO; total.add(five); //这并不会改变total的值,调用该方法的返回值,才是加法得到的结