09月22日, 2014 125次
样的代码时,都需要做这样的1到0的映射和转换(熟练了就是下意识的转换),确实也有点“坑爹”,所以它也不能幸免,排在第8位。
4、ArrayList遍历删除时报错
Talk is cheap,先上代码:
public static void main(String[] args) { List String list = new ArrayList String list.add( abc list.add( bc list.add( bc list.add( abcd list.add( abcdef //报错 int length = list.size(); for(int i = 0;i length;i++){ if(list.get(i).equals( bc )){ list.remove(i); } } }想从ArrayList中删除某个元素,于是,我们就写了上面的代码,但是它却抛出了IndexOutOfBoundsException异常,原因是ArrayList在删除元素后会重新计算数量,把list.size放在for循环中即可:
for(int i=0;i list.size();i++){ if(list.get(i).equals( bc )){ list.remove(i); } }当然,这种方法也存在问题,建议使用迭代器的方式来删除元素。ArrayList 增删千万不要乱用 hellip;推荐看一下这篇。
对于不太熟练的程序员来说,有时候就会掉入这样的陷阱之中。这是排名第7的情况。关注微信公众号:Java栈,在后台回复:Java,可以获取我整理的 N 篇 Java 教程,都是干货。
5、字符转成数字的坑
有时候,我们想把字符直接通过类型转换变成整数,比如像下面这样:
char symbol = 8 System.out.println((int) symbol);我们想要的结果是8,然而,上面的代码却输出了56,略显“坑爹”,具体原因参考ASCII的知识。
6、while循环体的“障眼法”
对于while循环语句,如果你没有加上大括号,即使后面的语句挨在一起,也只会执行第一条statement,比如:
int i = 0; while(i++ 3) System.out.print( A System.out.print( B上面的代码会输出:
AAAB而不是3个A、3个B,更“坑爹”的是,如果两条语句放在一行上,迷惑性会更大:
int i = 0; while(i++ 3) System.out.print( A System.out.print( B上面这种写法同样是输出AAAB。所以,象这样的情况,哪怕只有一条语句,也建议加上大括号,完美避坑。
7、Integer类有缓存
这个功能点也是面试的高频热点之一,稍不注意,也有可能被带入沟里,我们看看下面这段代码:
public static void main(String[] args){ Integer a = 100; Integer b = 100; Integer c = 200; Integer d = 200; System.out.println(a==b); System.out.println(c==d); }上面的代码竟然输出:
true false这确实太出乎意料了,同样的代码,只是数值不同(而且差别不太大的样子),就产生了不一样的输出,这也太离谱了。
原来,Integer中有一个静态内部类IntegerCache,在类加载的时候,它会把[-128, 127]之间的值缓存起来,而Integer a = 100这样的赋值方式,会首先调用Integer类中的静态valueOf方法,这个方法会尝试从缓存里取值,如果在这个范围之内就不用重新new一个对象了:
public static Integer valueOf(int i) { if (i = IntegerCache.low i = IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }此功能入选“坑爹”排行榜的第4名。IntegerCache的妙用和陷阱,推荐看一下。
8、空方法体导致死循环
如果循环的方法体为空,则会导致死循环,比如,下面的代码打印出数字1,2,3:
int i = 1; while(i 4){ System.out.println(i++); }如果你在敲键盘的时候,不小心在while结尾处加了一个分号(如果方法体没有加大括号,更容易产生这种情况):
int i = 1; while(i { System.out.println(i++); }你猜怎么着,上面的代码可以正常编译并运行,然而,它却陷入了死循环 hellip; hellip;是不是非常“坑爹”?for循环也存在类似的情况。
它高居排行榜的第3位。
9、神奇的=+
我们知道,对于类似a=a+b这样的赋值语句,有一种简写方式:a +=b,然而,如果你不小心写成了a =+ b,结果又会是什么呢?我们看看下面的代码:
int i = 100; i =+ 2; //注意,加号在后面 System.out.println(i);上面的代码既不会输出102,也不会报错,而是输出2,这的确出乎意料,完全不是我们期望的结果,太神奇了,非常的“坑爹”。
所以,它排名第2,稳居榜眼的位置。
10、Java注释能够识别Unicode
先看看代码:
public static void main(String[] args){ // \\u000d System.out.println( Hello World! }乍一看,代码都被注释掉了,当然不会输出任何东西,然而,它还是输出每个程序员都倍感亲切的Hello World,这是因为,unicode解码发生在代码编译之前,编译器将\u样式的代码进行文本转义,即使是注释也是这样,然后\u000a被转换成\n换行符,所以println代码得以正常执行。
“Java坑爹的功能有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!