那些年写过的Bug——List remove

最近接到的一个需求,实现中使用的到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);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值