论坛首页 入门技术论坛

某公司的java笔试题,来测测你的基础如何吧

浏览 53357 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-06-02   最后修改:2010-06-02
基本的正则表达式 是程序员必不可少的强大武器

String classPath = "java.lang.String";
		System.out.println(classPath.replaceAll(".", "/"));
		System.out.println(classPath.replaceAll("[.]", "/"));
0 请登录后投票
   发表时间:2010-06-02  
不对, 那个Increment 的题理解错了, 求解
0 请登录后投票
   发表时间:2010-06-02  
mathfox 写道

那本书都是类似的这种题,我记不清是java cookbook还是java puzzle什么名了。

你出的这些题,在这个论坛,每个题都有人单独发过贴。并且有很多讨论。

这些题不是我出的,是从朋友那拿过来的,我也做了一次,然后对每个题都深入理解分析了解了一下,感觉这些题还行吧,考的知识点比较多,大多涉及了一些java底层细节实现的知识,虽然得出答案不难,但还是能检测出一些问题来的,根据笔试者的答题情况,面试的时候针对这些问题深入下去还是能聊一会儿的,呵呵,个人观点。
刚搜索了下确实有本Java Puzzlers这本书,中文名为《java 解惑》有空找本来看看。
0 请登录后投票
   发表时间:2010-06-02  
nickevin 写道
int j = 10;

		for (int i = 0; i < 100; i++) {
			j = j + j;
		}

		System.out.println(j);


改造一下 结果如何


为什么结果是还是0, 我追到32次的时候, 后面就全部是0了, 想知道答案
0 请登录后投票
   发表时间:2010-06-02   最后修改:2010-06-02
queal 写道
nickevin 写道
int j = 10;

		for (int i = 0; i < 100; i++) {
			j = j + j;
		}

		System.out.println(j);


改造一下 结果如何


为什么结果是还是0, 我追到32次的时候, 后面就全部是0了, 想知道答案



int j = 10;
BigDecimal bg = new BigDecimal(10);

for (int i = 0; i < 100; i++) {
j = j + j;
bg = bg.add(bg);
}

System.out.println(j);
System.out.println(bg);

inteter -32768 - 32767 2 带符号16位 结果是 12676506002282294014967032053760 integer越界了
0 请登录后投票
   发表时间:2010-06-02  
nickevin 写道
queal 写道
nickevin 写道
int j = 10;

		for (int i = 0; i < 100; i++) {
			j = j + j;
		}

		System.out.println(j);


改造一下 结果如何


为什么结果是还是0, 我追到32次的时候, 后面就全部是0了, 想知道答案



int j = 10;
BigDecimal bg = new BigDecimal(10);

for (int i = 0; i < 100; i++) {
j = j + j;
bg = bg.add(bg);
}

System.out.println(j);
System.out.println(bg);

越界了
public static void main(String[] args) {
  int j = 10;
  for (int i = 0; i < 100; i++)
   j = j + 1000000000;
  System.out.println(j);
 }

 
越界也不应该是0, 请你看一下这个例子, 也是越界, 但为什么结果差那么多?

 

0 请登录后投票
   发表时间:2010-06-02  
queal 写道
nickevin 写道
int j = 10;

		for (int i = 0; i < 100; i++) {
			j = j + j;
		}

		System.out.println(j);


改造一下 结果如何


为什么结果是还是0, 我追到32次的时候, 后面就全部是0了, 想知道答案


理解这道题可以先看看以下代码:

int minvalue = Integer.MIN_VALUE;
int maxvalue = Integer.MAX_VALUE;
System.out.println((maxvalue+1) == minvalue);  //print true
minvalue + minvalue = 0;

 这就是最后打印结果为0 的原因,然后再去想想两个minvalue 相加结果为什么会是0,这个就涉及到16进制换算的规则了。

 

0 请登录后投票
   发表时间:2010-06-02  
我知道了, 越界相加, 第32回加回0了, 诶, 又是一道阴险题啊
0 请登录后投票
   发表时间:2010-06-02  
nickevin 写道
queal 写道
nickevin 写道
Java代码
  1. int j = 10;  
  2.   
  3.         for (int i = 0; i < 100; i++) {  
  4.             j = j + j;  
  5.         }  
  6.   
  7.         System.out.println(j);  
int j = 10;

		for (int i = 0; i < 100; i++) {
			j = j + j;
		}

		System.out.println(j);


改造一下 结果如何


为什么结果是还是0, 我追到32次的时候, 后面就全部是0了, 想知道答案



int j = 10;
BigDecimal bg = new BigDecimal(10);

for (int i = 0; i < 100; i++) {
j = j + j;
bg = bg.add(bg);
}

System.out.println(j);
System.out.println(bg);

越 界了
Java代码
  1. public static void main(String[] args) {  
  2.   int j = 10;  
  3.   for (int i = 0; i < 100; i++)  
  4.    j = j + 1000000000;  
  5.   System.out.println(j);  
  6.  }  
public static void main(String[] args) {
  int j = 10;
  for (int i = 0; i < 100; i++)
   j = j + 1000000000;
  System.out.println(j);
 }

 
越界也不应该是0, 请你看一下这个例子, 也是越界, 但为什么结果差那么多?

 

 

 

追踪i和j的变化值如下:

     j                   i

838860800      22
1677721600     23
-939524096     24
-1879048192    25
536870912      26
1073741824     27
-2147483648    28
0              29 

 

也就是说当i=28时,j为最小的int值,两个最小的int值相加就是0(可以换成二进制进行运算可得)

 

0 请登录后投票
   发表时间:2010-06-02  
真的在考程序员对基础的理解,但是一不小心就会中了出题者的陷阱.要仔细看题.
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics