java解惑——循环,你真的会吗??

使用StringBuffer时应该注意的:
  StringBuffer sb = new StringBuffer('M');
  sb.append("abc");
  System.out.println(sb.toString());

   该程序会输出什么呢?   不是 mabc   输入结果为: abc
   为什么m没有输出来呢?奇怪了? 其实也不是很奇怪,StringBuffer没有字符为参数的构造方法,只有int作为缓冲区初始容量的构造器。
在本例子中, new StringBuffer('M') 返回的是一个具有初始容量77的空字符串缓冲区。


**2******************************************************************************************************************

 

下面的程序循环遍历byte数值,以查找某个特定值。这个程序会打印出什么?

public class BigDelight {
 
public static void main(String[] args) {
  
for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++{
   
if (b == 0x90)
    System.out.println(
"hello");
  }

 }

}



 

结果什么都没有打印。
  0x90是一个两位数的十六进制字面常量,每一个十六进制位都占据4个比特的位置,
所以整个数值也只占8个比特,即1个byte。问题在于byte是有符号类型,常量0x90是
一个正的最高位被置为8位int数值。合法的byte数值是从-128到+127,但是常量0x90等于+144


上面这个程序大家应该都能理解,但是下面整个判断是true还是false呢?
( (byte)0x90 == 0x90 ) ,当然是false啦,有点java基础知识的人都知道会转化成int比较的,
但转化后值是多少呢? 这个这个。。。。。hoho   (byte)0x90 提升为int数值-122,而0x90为144


如果要实现比较,其实也很简单。

方法一: 只要我们相同的类型比较就可以啦,苹果跟苹果比较,桔子跟桔子比较。
最上面的程序改成:
if (b == (byte)0x90)
    System.out.println("hello");
这就可以打印出来了。

方法二:
可以用一个屏蔽码来消除符号扩展的影响,从而将byte转化为int,之后就可以拿到一个int与另一个int进行比较了。
if ( (b & 0xff) == 0x90)
    System.out.println("hello");

   虽然上面的两种方法都可以,但是避免这类问题的最佳方法还是将常量值移到循环的外面,并在一个常量种定义它。

1public class BigDelight {
2 private static final byte TARGET = (byte)0x90;
3 public static void main(String[] args) {
4  for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++{
5   if ( b == TARGET )
6    System.out.println("hello");
7  }

8 }

9}

 

 




****3**************************************************************************************
下面的程序输入结果是什么呢?

public class Incremet {
 
public static void main(String[] args) {
  
int j = 0;
  
for(int i=0;i<100;i++){
   j 
= j++;
  }

  System.out.println(j);
 }


}

 


乍一看应该慧是100吧。 毕竟做了100次循环增量。   结果确是0


j = j++; 整个操作细分开来大家都知道:
int temp = j;
j = j+1 ;
j = temp;

 那如果是这样那么结果就不用怀疑了,j=0

****4***************************************************************************


下面的程序输出什么呢?

 1public class InTheLoop {
 2 public static final int END = Integer.MAX_VALUE;
 3 public static final int START = Integer.MIN_VALUE;
 4 public static void main(String[] args) {
 5  int count = 0;
 6  for(int i=START;i<=END;i++){
 7   count ++;
 8  }

 9  System.out.println(count);
10 }

11}

 

应该是101吧,应该,那就是错啦,实际上是:在for循环中,出现了无限循环。
当i达到Integer.MAX_VALUE时,并且再次执行增量操作时,它就又绕回到了Integer.MIN_VALUE。 所以就出现无限循环。

 


求:寻找一种定义,使得下面的循环一直无限,
   (1). for(int i=start;i<=start+1;i++){}
   (2). while(i== i+1){}
   (3). while(i !=i ){}
   (4). while(i!= i + 0 ){},附加要求,不能使用浮点数类型
   (5). while(i<=j && i>=j && i!=j ){}
   (6). while(i!=0 && i== -i ){} 

解答(1):int start = Integer.MAX_VALUE-1;   //不信你可以试一试
解答(2):可以用任何计算位无穷大的浮点算术表达式来实现:
double i = 1.0/0.0; 一般都使用浮点数常量:double i = Double.POSITIVE_INFINITY;事实上,不必将i初始化为无穷大,
任何足够大的浮点数都可以实现这一目的。例如:double i = 1.0e40;
解答(3):double i=0.0/0.0; 即:double i = Double.NaN;
解答(4):把i定义成string类型就可以实现啦
解答(5):Integer i = new Integer(0);  Integer j = new Integer(0);
解答(6):int i = Integer.MIN_VALUE; 或 long i = Long.MIN_VALUE;

 


寻找i一种定义,使得 if( i-i == 0 ){} if中的条件永远为false?
解答:double i=0.0/0.0; 即:double i = Double.NaN;

 

 

 

 

 

 

 

 

 


 

posted on 2009-04-07 22:49 胡鹏 阅读(266) 评论(0)  编辑  收藏 所属分类: java基础


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(3)

随笔分类

随笔档案

agile

搜索

最新评论

阅读排行榜

评论排行榜