今天谁又写了个bug,没错,他好像在说我。.....作为Java开发,我们在编写代码的过程中难免会产生各种奇葩的bug。有些BUG相当令人沮丧,比如各种空指针异常,ArrayList迭代中的删除操作导致异常,数组下标越界异常等等。如果你不小心看到同事的代码有我描述的bug,那你可以把这篇文章甩给他!!!你扔给他一篇文章,让他关注一波cxuan,就会让他一副宝藏在背后膜拜大神的样子。废话少说,言归正传。错误一:Array转ArrayListArray转ArrayList还会出错吗?这是愚蠢的。.....等等,先别着急,我们先看看是怎么回事。如果要将数组转为ArrayList,我们一般的做法是这样Listlist=Arrays.asList(arr);1Arrays.asList()会返回一个ArrayList,Arrays中的私有静态类,它不是java的.util.ArrayList类。如下图所示,Arrays内部的ArrayList只有set、get、contains等方法,而没有像add这样可以改变其内部结构的方法,所以Arrays内部的ArrayList的大小是固定的。如果想创建一个可以添加元素的ArrayList,可以使用如下创建方法:ArrayListarrayList=newArrayList(Arrays.asList(arr));1因为ArrayList的构造函数可以接收一个Collection收藏,所以这种创作方式是可行的。错误二:检查数组是否包含某个值检查数组是否包含某个值,一些程序员经常这样做:Setset=newHashSet(Arrays.asList(arr));返回集。包含(目标值);12虽然这段代码是正确的,但它有额外的性能损失。一般情况下,不需要转成set,直接转:returnArrays.asList(arr).contains(targetValue);1或者用下面的方法(穷举法,循环判断)for(Strings:arr){if(s.equals(targetValue))返回真;}返回假;上面的第一段代码比第二段更具可读性。错误三:在List中循环删除元素是一个错误相信很多朋友都知道。在循环中删除元素是大忌。有一段时间,当我审查代码时,我喜欢看看其他团队成员是否犯了这个错误。错误。毕竟,为什么不能这样做(删除集合中的元素)?并查看以下代码https://www.doc88.com/p-67216...ArrayListlist=newArrayList(Arrays.asList("a","b","c","d"));for(inti=0;ilist=newArrayList(Arrays.asList("a","b","c","d"));for(Strings:list){if(s.equals("a"))list.remove(s);}然后你填Confidentrunxxx.main()方法,结果。.....为什么会出现ConcurrentModificationException?这是因为在ArrayList中使用外部remove元素会导致其内部结构和游标发生变化。在阿里巴巴的开发规范中,也有说明不要对for-each循环内的元素进行remove/add操作。所以如果要用List来增删元素,就必须用迭代器来删除。那是https://www.doc88.com/p-67216...ArrayListlist=newArrayList(Arrays.asList("a","b","c","d"));Iteratoriter=list.iterator();while(iter.hasNext()){Strings=iter.next();if(s.equals("a")){iter.remove();}}.next()必须在.remove()之前调用。在foreach循环中,编译器在元素删除操作后调用.next(),导致ConcurrentModificationException。误区四:Hashtable和HashMap这是一种算法规范:按照算法约定,Hashtable是数据结构的名称,而在Java中,数据结构的名称是HashMap,Hashtable和HashMap的主要区别之一是那Hashtable是同步的,所以很多时候不需要Hashtable,而是用HashMap。错误5:使用原始类型的集合这是对泛型的约束:在Java中,原始类型和无限通配符类型很容易混合在一起。以Set为例,Set是原始类型,Set>是无界通配符类型。例如,以下代码使用原始类型List作为参数:publicstaticvoidadd(Listlist,Objecto){list.add(o);}publicstaticvoidmain(String[]args){Listlist=newArrayList();add(list,10);Strings=list.get(0);}这段代码会抛出java.lang.ClassCastException,为什么?使用原始类型集合是危险的,因为原始类型会跳过泛型检查并且不安全。Set、Set>和Set