1、Java注释能够识别Unicode
关于问题还引申出一个概念“Unicode 逃逸”,并且为什么会有这种机制,有什么作用,我之前写过一篇文章,这里面已经做了详细的介绍,请大家点击并仔细阅读这篇文章:
2、Integer类型的数值比较
大家来看看下面的这段代码执行的结果是什么?
public static void main(String[] args) {Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a == b);System.out.println(c == d);}
它的执行结果是:
如果你答对了,那么恭喜你,你已经知道他的原理了,可以跳着看下面的第三个坑。
对于比较Integer类型的数据,相信很多人会用“==”去比较,而且很多人感觉输出的结果是两个true。实际上这段代码的输出结果是true和false;
原因如下:
它的内部维护了一个缓存池,如果超出了这个缓存池(-128到127),它就会new一个新的Integer对象。但是数字只要在这个缓存池范围内,就不会new一个新对象,它会直接取出对象而不是创建新的对象,所以他们是相等的,但是如果超过了这个范围,那么它就创建一个新的对象(-2147483648到-128和128到2147483647),所以返回的会是false结果。
因此我们比较两个Integer是相等的时候应该用equals()方法或者用a.intValue()==b.intValue()这两个方法来比较
3、空指针异常
在某些场景下,我们经常会使用对象就get或者set值,如果这个对象为空的时候,也就是null.get()或者null.set()都会报空指针异常
解决方法:
我们每次都需要判断这个对象是否为空,不要嫌麻烦,要保证代码的健壮性。
4、空方法体导致死循环
如果循环的方法体是空的,那么就会导致该循环成为一个死的循环,比如,下图所示的代码会打印出1,2,3,4,如图所示:
如果你不小心在while后面多打了一个分号,如下:
大家仔细看看这段代码将会输出什么结果?
你们不妨运行下试试,已经陷入了死循环,当然for循环也存在这样的情况。这是非常坑的事情。
5、split()方法参数特殊字符需要转译的问题
String[] arr = amtStr.split("\\.");
String[] arr = amtStr.split("\\|");
6、ArrayList遍历删除时报错
大家觉得下面的这段代码有问题吗》
public static void main(String[] args){List list = new ArrayList();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");int length = list.size();for (int i = 0; i < length; i++) {if (list.get(i).equals("2")) {list.remove(i);}}}
这段代码是从ArrayList中删除元素,上面的代码会抛出IndexOutOfBoundsException异常,原因是ArrayList在删除元素后会重新计算数量。
那么怎么样解决这个问题呢,我们只需要把list.size()放在for循环中就可以了,上面的代码我们改造下就没有问题了,如下所示:
public static void main(String[] args){List list = new ArrayList();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");for (int i = 0; i < list.size(); i++) {if (list.get(i).equals("bc")) {list.remove(i);}}}
像这样的坑还有很多,大家日常开发中还遇到过哪些坑呢,不妨说出来一起交流下!
你点的每个“在看”,我都当成了喜欢