写文章 Java 中最坑爹的 “坑“

int[] arr = newint[]{1, 3, 5, 7, 9};

for(int i = 0;i < arr.length;i++){

System.out.println(“the element is:” + arr[i]);

}

这跟我们日常生活中的经验是相违背的,正常情况都是从第1个元素开始计数的,特别是对于初学者来说有点难以接受,会觉得很惊讶。即使对于经验丰富的程序员来说,有些地方也需要格外注意,比如:

String str = “hello world”;

System.out.println(str.charAt(1));

我们知道,charAt的作用是获取字符串中某个位置的字符,然而,上面的代码并不是输出第一个字符h,而是e,因为数组是从零开始计数的,这个也是比较“坑爹”啊。当然,设计者这么做的原因是考虑到了内存偏移量的因素。

每次在编写这样的代码时,都需要做这样的1到0的映射和转换(熟练了就是下意识的转换),确实也有点“坑爹”,所以它也不能幸免,排在第8位。

Top7. ArrayList遍历删除时报错


Talk is cheap,先上代码:

publicstaticvoidmain(String[] args){

List list= new ArrayList;

list.add( “abc”);

list.add( “bc”);

list.add( “bc”);

list.add( “abcd”);

list.add( “abcdef”);

//报错

int length = list.size;

for(inti = 0;i < length;i++){

if(list.get(i).equals( “bc”)){

list.remove(i);

i = i - 1;

}

}

}

想从ArrayList中删除某个元素,于是,我们就写了上面的代码,但是它却抛出了IndexOutOfBoundsException异常,原因是ArrayList在删除元素后会重新计算数量,把list.size放在for循环中即可:

for(int i = 0;i < list.size;i++){

if(list.get(i).equals( “bc”)){

list.remove(i);

i = i - 1;

}

}

当然,这种方法也存在问题,建议使用迭代器的方式来删除元素。

对于不太熟练的程序员来说,有时候就会掉入这样的陷阱之中。这是排名第7的情况。

Top6. 字符转成数字的坑


有时候,我们想把字符直接通过类型转换变成整数,比如像下面这样:

char symbol = ‘8’;

System.out.println((int) symbol);

我们想要的结果是8,然而,上面的代码却输出了56,略显“坑爹”,具体原因参考ASCII的知识。

Top5. 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。所以,象这样的情况,哪怕只有一条语句,也建议加上大括号,完美避坑。

Top4. Integer类有缓存


这个功能点也是面试的高频热点之一,稍不注意,也有可能被带入沟里,我们看看下面这段代码:

publicstaticvoidmain(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一个对象了:

publicstatic Integer valueOf(inti){

if(i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

returnnew Integer(i);

}

此功能入选“坑爹”排行榜的第4名。

Top3. 空方法体导致死循环


如果循环的方法体为空,则会导致死循环,比如,下面的代码打印出数字1,2,3:

int i = 1;

while(i < 4){

System.out.println(i++);

} 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】

如果你在敲键盘的时候,不小心在while结尾处加了一个分号(如果方法体没有加大括号,更容易产生这种情况):

你可能感兴趣的:(Java,经验分享,架构)