那些年写过的Bug——List remove

来源:互联网 发布:软件评测师培训费用 编辑:程序博客网 时间:2024/06/10 14:27

最近接到的一个需求,实现中使用的到java.util.List.remove()方法,然后后就写出了下面的Bug:

    /**     * 找到列表中某个元素,将其删除     */    public static void main(String[] args) {        // 创建一个列表,加入几个string元素        List<String> strList = new ArrayList<String>();        strList.add("aaa");        strList.add("bbb");        strList.add("ccc");        // 将要删除的元素        String str = "bbb";        // 记录将要删除元素的index        Integer flag = null;        for (int i = 0; i < strList.size(); i++) {            if (str.equals(strList.get(i))) {                flag = i;                break;            }        }        // 如果找到元素,删除        if (null != flag) {            strList.remove(flag);        }    }

测试的时候很是抓狂,逻辑上没问题啊,怎么就是没remove掉呢?

后来打断点,debug,跟进remove方法时,知晓了答案。

首先看看java.util.List remove()的API:

public interface List<E> extends Collection<E> {    /**     * Removes the first occurrence of the specified element from this list,     * if it is present (optional operation).  If this list does not contain     * the element, it is unchanged.  More formally, removes the element with     * the lowest index <tt>i</tt> such that     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>     * (if such an element exists).  Returns <tt>true</tt> if this list     * contained the specified element (or equivalently, if this list changed     * as a result of the call).     *     * @param o element to be removed from this list, if present     * @return <tt>true</tt> if this list contained the specified element     * @throws ClassCastException if the type of the specified element     *         is incompatible with this list     * (<a href="Collection.html#optional-restrictions">optional</a>)     * @throws NullPointerException if the specified element is null and this     *         list does not permit null elements     * (<a href="Collection.html#optional-restrictions">optional</a>)     * @throws UnsupportedOperationException if the <tt>remove</tt> operation     *         is not supported by this list     */    boolean remove(Object o);    /**     * Removes the element at the specified position in this list (optional     * operation).  Shifts any subsequent elements to the left (subtracts one     * from their indices).  Returns the element that was removed from the     * list.     *     * @param index the index of the element to be removed     * @return the element previously at the specified position     * @throws UnsupportedOperationException if the <tt>remove</tt> operation     *         is not supported by this list     * @throws IndexOutOfBoundsException if the index is out of range     *         (<tt>index &lt; 0 || index &gt;= size()</tt>)     */    E remove(int index);}

我的代码中Integer flag = null; 定义的是一个Object,在使用API时,执行的是boolean remove(Object o);;而我真正需要使用的API是E remove(int index);

修改上面的代码,修改后的代码如下:

    /**     * 找到列表中某个元素,将其删除     */    public static void main(String[] args) {        // 创建一个列表,加入几个string元素        List<String> strList = new ArrayList<String>();        strList.add("aaa");        strList.add("bbb");        strList.add("ccc");        // 将要删除的元素        String str = "bbb";        // 记录将要删除元素的index        Integer flag = null;        for (int i = 0; i < strList.size(); i++) {            if (str.equals(strList.get(i))) {                flag = i;                break;            }        }        // 如果找到元素,删除        if (null != flag) {            int i = flag; // 将object 转成 int            strList.remove(i);        }    }