`
ol_beta
  • 浏览: 282758 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

java中的陷阱 你注意了么?

    博客分类:
  • java
阅读更多

总结几个经典的java陷阱给大家。

答案隐藏了,Ctrl+A显示。建议先思考一下结果,然后运行代码试验。也许你会恍然大悟。

1、找奇数:

public static boolean isOdd(int i){ 
		 return i % 2 == 1; 
	}
 

上面的方法真的能找到所有的奇数么?

A:没有考虑到负数问题,如果传参是负数,那么永远不能得到结果!应该是:return i % 2 != 0;

2、浮点数想减

System.out.println(2.0-1.9);
 

 

上面会打印0.1么?

A:不会,自己试验就知道结果了。正确做法:用decimal。

3、交换

int x = 2010; 
int y = 2012; 
x^=y^=x^=y;
System.out.println("x= " + x + "; y= " + y);
 

 

x、y的值呼唤了么?

A:没有,java运算顺序是从左到右的,应该这么写:y=(x^= (y^= x))^ y;

4、字符和字符串

System.out.println("H" + "a");
System.out.println('H' + 'a');
  

上面两个语句输出结果相同么?

A:不想同,字符会被转换成在数字。所以第一句输出:Ha,第二句输出两个字符的assii码相加的数字。

5、无限循环

public static final int END = Integer.MAX_VALUE; 
public static final int START = END - 100; 
public static void main(String[] args) {
	int count = 0; 
	for (int i = START; i <= END; i++) 
		count++; 
	System.out.println(count); 
	}
 

 

上面程序运行的结果是什么?

A:无限循环。将i<=END改成i<END?为什么呢?你知道的,呵呵!

6、计数器问题

int minutes = 0; 
for (int ms = 0; ms < 60*60*1000; ms++) 
	if (ms % 60*1000 == 0) 
	    minutes++; 
System.out.println(minutes);
 

 

结果跟你想的一样么?

A:呵呵,括号问题,不多说!

7、到底返回什么?

public static boolean decision() { 
	 try { 
	    return true; 
	} finally { 
	  return false; 
	} 
} 
 

true?false?

A:一般情况下,不管怎么说try/catch代码块中,finally总是最后被执行的。

8、错误里聚集遍历

public static void main(String[] args) {
		Vector v = new Vector();
		v.add("one");
		v.add("two");
		v.add("three");
		v.add("four");
		Enumeration enume = v.elements();
		while (enume.hasMoreElements()) {
			String s = (String) enume.nextElement();
			if (s.equals("two"))
				v.remove("two");
			else {
				System.out.println(s);
			}
		}
		System.out.println("What's really there...");
		enume = v.elements();
		while (enume.hasMoreElements()) {
			String s = (String) enume.nextElement();
			System.out.println(s);
		}
	}
 

运行代码看看结果跟你想的一样么?

A:一般不建议在遍历聚集的时候对聚集进行操作。为什么结果是这样呢?看JDK源码能得到答案。Enumeration没有实现Fail Fast操作,如果换成ArrayList,上面的代码可能会出错。《java与模式》迭代子(iterator)介绍了。

推荐:《Java解惑》

分享到:
评论
17 楼 gaohenggaoheng 2011-10-12  
第八个这样就可以了:

List v = new ArrayList(); 
        v.add("one"); 
        v.add("two"); 
        v.add("three"); 
        v.add("four"); 
        Iterator t = v.iterator(); 
        while (t.hasNext()) { 
            String s = (String) t.next(); 
            if (s.equals("two")) 
                t.remove(); 
            else { 
                System.out.println(s); 
            } 
        } 
        System.out.println("What's really there..."); 
        Iterator tt = v.iterator(); 
        while (tt.hasNext()) { 
            String s = (String) tt.next(); 
            System.out.println(s); 
        } 
16 楼 tonyinfy2011 2011-10-12  
A:《Java解惑》里有更详细的解释啊,Answer见书
15 楼 lzl836 2011-10-12  
shuaiji 写道
socrazy06 写道
第七题应该是true吧?

地球人都知道

地球人都知道你是错的。
14 楼 athrunwang 2011-10-11  
有点儿意思,学习了!
13 楼 yitiaolo 2011-10-11  
不知道博主是否试过
-11%2,-10%2
12 楼 LubinJava 2011-10-11  
我了个去.我傻了.
11 楼 foohsinglong 2011-10-11  
经过测试是false,得好好看看java puzzlers了
10 楼 foohsinglong 2011-10-11  
socrazy06 写道
第七题应该是true吧?

是了true
9 楼 qpshenggui 2011-10-11  
gdwenjun 写道
答案隐藏了,Ctrl+A显示。看不到答案啊

把带A:的那一行选中就看见了
8 楼 shuaiji 2011-10-11  
socrazy06 写道
第七题应该是true吧?

地球人都知道
7 楼 soutnila 2011-10-11  
平时会有人这么写代码吗?比如括号问题,很多东西运行结果不正确是很容易调试的。楼主真会炫耀。。浮躁。。
6 楼 socrazy06 2011-10-11  
第七题应该是true吧?
5 楼 1051620106 2011-10-11  
真是好东西啊
4 楼 gdwenjun 2011-10-11  
Ctrl+A
3 楼 zhaoshun0417 2011-10-11  
Ctrl+A
2 楼 gdwenjun 2011-10-11  
答案隐藏了,Ctrl+A显示。看不到答案啊
1 楼 tangkang87 2011-10-11  
double a = 2.0;
double b = 1.9;

System.out.println((float)(a-b));
这个就能打印出结果0.1

相关推荐

    java常见疑惑与陷阱

    里面介绍了一些java的常见疑惑与陷阱,让我们注意到一些以前没有察觉到的不良设计或习惯,提高代码质量

    Java基础复习笔记03我们不会注意的陷阱

    Java基础复习笔记03我们不会注意的陷阱

    Java基础复习笔记03我们不会注意的陷阱.pdf

    Java基础复习笔记03我们不会注意的陷阱.pdf

    注意对象的通用方法,类的设计陷阱.pdf

    注意对象的通用方法,类的设计陷阱.pdf

    java常用设计模式

    我们在使用模式的时候,一定要注意模式的意图(intent),而不 要过多的去关注模式的实现细节,因为这些实现细节在特定情况下,可能会发生一些改变。不要顽固地认为设计模式一书中的类图或实现代码就代表了模式本身...

    突破程序员基本功的16课.part2

    4.4.5 避免在经常调用的方法、循环中创建Java对象 4.4.6 缓存经常使用的对象 4.4.7 尽量不要使用finalize方法 4.4.8 考虑使用SoftReference 4.5 小结 第5课 表达式中的陷阱 5.1 关于字符串的陷阱 5.1.1 JVM...

    java版商城源码-hello-erlang:Erlang的笔记和例子

    java版商城源码你好二郎! 这些是我在学习过程中关于 Erlang 的笔记和主要引用。 检查部分以查看我从哪里获取报价。 请注意,此 repo 始终在进行中。 (我还没找到时间完成这本书。) 话题 陷阱 erlang 没有null值...

    Cinch:一个Java库,用于管理MVC模式的组件actionevent绑定

    Cinch-使MVC变得容易的注释 关于 Cinch使Swing中的MVC变得容易。... 信不信由你,这是一个完整的Swing程序(请注意,缺少匿名侦听器对象) 提供了完整的源代码: public class IntroCinchMVC { public stati

    30天搞定Java–day20

    2. 同步代码块中涉及到同步监视器和共享数据,谈谈你对同步监视器和共享数据的理解,以及注意点 同步监视器:可以是任意一个对象,但必须唯一,即多个线程共用同一把锁 共享数据:多个线程共用的数据 sleep()和wait...

    Javascript 陷阱 window全局对象

    ff和ie6下都是同样的运行结果,看来不是bug,那究竟是为什么呢? 注意到:对象方法访问其对象的属性时|必须|加以this.(和java不一样).

    CauldronGit:大锅吉特

    初始化子模块:git submodule update --init --recursive 设置工作区:gradlew setupCauldron 构建二进制文件:gradlew buildPackages 注意:所有二进制文件都将在发行版文件夹中支撑大锅单击此处向单击此处 [成为 ...

    Cauldron-Old:老大锅

    构建二进制文件:gradlew buildPackages 注意:所有二进制文件都将在发行版文件夹中 支撑大锅 单击此处向单击此处 [成为 Patreon] ( ) 顶级赞助人 伊西利登 爱奥尼克 陷阱 詹姆斯考恩斯 顺丰传媒 什米布 剖析 我们...

    深入讲解Python函数中参数的使用及默认参数的陷阱

    C++里函数可以设置缺省参数,Java不可以,只能通过重载的方式来实现,python里也可以设置默认参数,最大的好处就是降低函数难度,函数的定义只有一个,并且python是动态语言,在同一名称空间里不能有想多名称的函数,...

    自己平时做的android相关的总结

    Button 中的setLayoutParams使用注意: layout文件夹和raw文件下面的文件读取 Matrix方法中的set方法和post方法 android 中调用drawBitmap时理解dip(屏幕密度)和px(像素)的区别 SQLiteDatabase 的...

    java简易版开心农场源码-zookeeper_client_design_manual:zookeeperclientsdk开发必备指南,C

    针对碰到的大量陷阱,提出注意点,并对编写生产可用的sdk提供参考建议。 本设计(语言基于C++)是基于官方C版Client库而写,对于golang、java及其它语言均有借鉴意见。 由于竞业协议,代码不便公开,请谅解。 实现了...

Global site tag (gtag.js) - Google Analytics