List中删除元素的6种方法比较--前两种就是坑,因为size指针前移。

这里占用点地方记录LIst接口的几个常用方法:
List接口:
void add(int index, E element)
boolean remove(Object o);
boolean contains(Object o)
E get(int index)
E set(int index, E element)
直接上代码

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.*;

@RunWith(SpringJUnit4ClassRunner.class)  //更改junit的运行期,不要直接去找junit,而是先找spring-test,test模块才能拿到容器
@ContextConfiguration("classpath:applicationContext.xml")  //告知spring的配置文件
public class CollectionTest {
    @Test
    public void testListRemove0(){
        List<String> strings = new ArrayList<>();
        strings.add("科比");
        strings.add("韦德");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("博士");
        strings.add("詹姆士");
        System.out.println(strings);
        //删除方式0: 使用增强for
        try {
            for (String s : strings){
                if ("詹姆士".equals(s)){
                    strings.remove(s);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println(strings); //事实上会报ConcurrentModificationException异常
            // [科比, 韦德, 詹姆士, 詹姆士, 博士, 詹姆士]
        }
    }
    @Test
    public void testListRemove1(){
        List<String> strings = new ArrayList<>();
        strings.add("科比");
        strings.add("韦德");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("博士");
        strings.add("詹姆士");
        System.out.println(strings);
        //删除方法1:
        try {
            Iterator<String> iterator = strings.iterator();
            while(iterator.hasNext()){
                String next = iterator.next();
                if ("詹姆士".equals(next)){ //才不会运行师报空指针异常
                    strings.remove(next);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println(strings);  //事实上会出现ConcurrentModificationException:并发修改异常,
            // [科比, 韦德, 詹姆士, 詹姆士, 博士, 詹姆士] , 说明在remove第二个"詹姆士"的时候就会报这个concurrentmodificationException
        }
    }
    @Test
    public void testListRemove2(){
        List<String> strings = new ArrayList<>();
        strings.add("科比");
        strings.add("韦德");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("博士");
        strings.add("詹姆士");
        System.out.println(strings);
        //删除方法2:使用迭代器删除
        Iterator<String> iterator = strings.iterator();
        while(iterator.hasNext()){
            String next = iterator.next();
            if ("詹姆士".equals(next)){
                iterator.remove();
            }
        }
        System.out.println(strings); //[科比, 韦德, 博士], 说明删除成功
    }
    @Test
    public void testListRemove3(){
        List<String> strings = new ArrayList<>();
        strings.add("科比");
        strings.add("韦德");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("博士");
        strings.add("詹姆士");
        System.out.println(strings);
        //删除方法2:判断之后再删除
        while(strings.contains("詹姆士")){
            strings.remove("詹姆士");
        }
        System.out.println(strings);//[科比, 韦德, 博士], 说明删除成功
    }
    @Test
    public void testListRemove4(){
        List<String> strings = new ArrayList<>();
        strings.add("科比");
        strings.add("韦德");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("博士");
        strings.add("詹姆士");
        System.out.println(strings);
        //删除方法4: 倒循环删除
        for (int i = strings.size()-1; i >= 0; i--){
            String s = strings.get(i);
            if ("詹姆士".equals(s)){
                strings.remove(s);
            }
        }
        System.out.println(strings);//[科比, 韦德, 博士], 说明删除成功
    }
    @Test
    public void testListRemove5(){
        List<String> strings = new ArrayList<>();
        strings.add("科比");
        strings.add("韦德");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("詹姆士");
        strings.add("博士");
        strings.add("詹姆士");
        System.out.println(strings);
        //删除方法5: 循环时如果命中目标下标不动
        for (int i = 0; i < strings.size(); i++){
            String s = strings.get(i);
            if ("詹姆士".equals(s)){
                strings.remove(s);
                i--;
            }
        }
        System.out.println(strings);//[科比, 韦德, 博士], 说明删除成功
    }
}

你可能感兴趣的:(开发经验,list,junit,spring)