zoukankan      html  css  js  c++  java
  • List remove操作注意问题

    public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		List<String> list = new ArrayList<String>();
    		list.add("A");
    		list.add("B");
    		list.add("C");
    		list.add("D");
    		list.add("E");
    		for(int i = 0;i<list.size();i++){
    			if(!"A".equals(list.get(i))){
    				list.remove(i);
    			}
    		}
    		System.out.println("--查看结果--");
    		for(int i = 0;i<list.size();i++){
    			System.out.println(list.get(i));
    		}
    	}


    上面代码是要删除List集合中内容不为A的值

    输出结果应该为A

    可竟然是A C E

    原因:List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。

    解决方法:

    1、每移除一个元素以后再把i移回来


    for(int i = 0;i<list.size();i++){
    			if(!"C".equals(list.get(i))){
    				list.remove(i);
    				i=i-1;
    			}
    		}

    2、使用iterator.remove()方法删除

    for(Iterator ite = list.iterator();ite.hasNext();){
    			if(!"C".equals(ite.next())){
    				ite.remove();
    			}
    		}

    3.倒过来遍历list
    for(int i = list.size()-1;i>=0;i--){
    			if(!"C".equals(list.get(i))){
    				list.remove(i);
    			}
    		}

    注意:

    如果for-each遍历时删除元素将报
    Exception in thread "main" java.util.ConcurrentModificationException异常

    for(String s:list){
    			if(!"C".equals(s)){
    				list.remove(s);
    			}
    		}



  • 相关阅读:
    C/C++ 获取线程入口地址模块等
    C/C++ IAT HOOK MessageBoxW
    C/C++ HOOK 全局 API
    c/c++创建静态库
    如何画Windows窗体
    WindowsPE TLS表
    WindowsPE 延迟加载导入表
    WindowsPE 资源表
    WindowsPE 重定位表
    WindowsPE 导出表
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131415.html
Copyright © 2011-2022 走看看