我们常写的bug
作为java软件开发人员,在开发的过程中难免会遇到各种bug,比如异常错误等,下面就分享几个常见的bug。
1)Array转成ArrayList
如果要把数组转成ArrayList,你会怎样做呢?
String[] arr = { "a", "an", "snd" };
List<String> list = Arrays.asList(arr);
但这种方法不支持使用!因为Arrays内部的ArrayList只有set、get、contains等方法,但是没有能够像是add这种能够使其内部结构进行改变的方法,所以Arrays内部的ArrayList的大小固定。
如果要创建一个能添加元素的ArrayList,你可以使用以下方式:
ArrayList<String> arraylist=new ArrayList<String>(Arrays.asList(arr));
2)检查某个数组是否包含某一个值
对于程序员来说,我们常常会这样来写:
Set<String> set=new HashSet<String>(Arrays.asList(arr));
return set.contains(value);
这样写虽然没有错误,但是有性能损耗。正常情况下,可以这样写:
return Arrays.asList(arr).contains(value);
或者使用穷举法方式:
for(String s:arr) {
if(s.equals(value)) {
return true;
}
return false;
}
3)在List中循环删除元素
集合中循环删除元素,得不到预期的结果!
ArrayList<String> list=new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(int i=0;i<list.size();i++) {
list.remove(i);
}
System.out.println(list);
然而,这个结果的输出答案是:[b, d]
为什么会只有两个值?我这不是在循环输出?
其实,在列表的内部,当你使用remove的时候,一旦remove一个元素后,其列表的内部结构会发生变化,一开始集合总容量是4,remove一个元素后就会变为3,然后在和i进行比较判断,所以只能输出两个元素。
你可能知道使用迭代器是正确的remove元素的方式,你可能还知道for-each和iterator这种方式类似,所以你写了:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
for (String s : list) {
if (s.equals("a")) {
list.remove(s);
}
}
System.out.println(list);
结果如何?
为什么?
那是因为使用ArrayList中外部remove元素,会造成其内部结构和游标的改变。
所以建议大家使用list进行元素的删除或者添加时,一定要使用迭代器进行操作:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();
if (s.equals("a")) {
iter.remove();
}
}