
平时最常用的莫过于ArrayList和HashMap了,面试的时候也是问答的常客。先不去管容量、负载因子什么的,就是简单的使用也会遇到坑。尤其是使用Remove.
经常遇到的一个场景是:遍历list, 然后找到合适条件的给删除掉,比如删除所有的偶数。
@Test
public void testRemove2(){
List<Integer> integers = new ArrayList<>(5);
integers.add(1);
integers.add(2);
integers.add(2);
integers.add(4);
integers.add(5);
for (int i = 0; i < integers.size(); i++) {
if (integers.get(i)%2==0){
integers.remove(i);
}
}
System.out.println(integers);
}
看起来好像没问题,加入面试的时候当面问:输出结果是什么?再问真不会报错吗?再问结果是什么?
结果是:
- 报错
- 结果是空list
- 结果是[1, 2, 5]
如果使用foreach是否可以实现刚开始的问题:
@Test
public void testRemove4(){
List<Integer> integers = new ArrayList<>(5);
integers.add(1);
integers.add(2);
integers.add(2);
integers.add(4);
integers.add(5);
for (Integer string : integers) {
integers.remove(string);
}
}
结果报错:
java.lang.UnsupportedOperationException
正确的remove做法是:
方法一:
@Test
public void testRemove9(){
List<Integer> integers = new ArrayList<>(5);
integers.add(1);
integers.add(2);
integers.add(2);
integers.add(4);
integers.add(5);
Iterator<Integer> iterator = integers.iterator();
while (iterator.hasNext()){
Integer next = iterator.next();
if (next%2 == 0){
iterator.remove();
}
}
System.out.println(integers);
}
方法二:
@Test
public void testRemove7(){
List<Integer> integers = new ArrayList<>(5);
integers.add(1);
integers.add(2);
integers.add(2);
integers.add(4);
integers.add(5);
for(int i= integers.size()-1;i>=0;i--)
{
if (integers.get(i)%2==0){
integers.remove(i);
}
}
System.out.println(integers);
}

评论列表