A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 揭耀祖 中级黑马   /  2012-5-24 19:07  /  2322 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  ArrayList<String>  list = new ArrayList<String>();

  list.add("java");
  list.add("abc");
  list.add("java");
  list.add("bcd");
  list.add("java");
  list.add("java");

for(int i=0;i<list.size();i++)
  {
        if("java".equals(list.get(i)))
          {
             list.remove(i);
          }
  }
  System.out.println(list);
为什么输出的是abc bcd java 而不是 abc bcd
那个"java"为什么就是删不掉?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

12 个回复

倒序浏览
if("java".equals(list.get(i).toString()))
          {
             list.remove(i);
          }
加个toString()试下看

点评

我试过了,结果是一样的  发表于 2012-5-24 19:27
回复 使用道具 举报
for(int i=0;i<list.size();i++)循环一次list.size就变一次
回复 使用道具 举报
奥,不好意思 回答错了
应该是最后那里list.remove(i);
应该是i的下表越界了  但不知道怎么没报错,应为i的值应该是5了,前面应景消除了2个应该岳杰了
import java.util.ArrayList;

class test{
        public static void main(String []args){
                ArrayList<String>  list = new ArrayList<String>();
                  list.add("java");
                  list.add("abc");
                  list.add("java");
                  list.add("bcd");
                  list.add("java");
                  list.add("java");

                for(int i=0;i<list.size();i++)
                  {
                        if("java".equals(list.get(i).toString()))
                          {
                             list.remove(i);
                          }
                  } list.remove(2);
                  System.out.println(list);
        }
}

结果就没"java"了

点评

我把你的代码运行了一遍,还是有"java"  发表于 2012-5-24 19:30
回复 使用道具 举报
本帖最后由 黑马张健 于 2012-5-24 20:54 编辑

删不掉,是因为ArrayList集合,是一个有序集合,元素的角标会随着你的删除,自动往前。
比如一个集合                               list["a","b","c","d","e"]
开始对应的元素下标分别是:                     0    1   2   3    4
删除了其中一个c之后,下标,就开始改变了    list["a","b","d","e"]
                                                                           0    1    2   3
                   list.add("java");
                   list.add("abc");
                   list.add("java");
                   list.add("bcd");
                   list.add("java");
                   list.add("java");
list["java","abc","java","bcd","java","java"]
         0     1        2       3       4       5
for循环删除一个java后:集合变为
list["abc","java","bcd","java","java"]
         0     1        2       3       4      
当i++后成为1
这时把下标为1的元素取到,并删除后集合元素下标如下
list["abc","bcd","java","java"]
         0     1         2       3  
当i++后成为2
这时把下标为2的元素取到,并删除后集合元素下标如下
list["abc","bcd","java"]
         0     1         2        
当i++为3时,不满足for循环的条件。
所以打印abc、bcd、java

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  ArrayList<String>  list = new ArrayList<String>();

  list.add("java");
   list.add("abc");
   list.add("java");
   list.add("bcd");
   list.add("java");
   list.add("java");

for(int i=0;i<list.size();i++)
   {
         if("java".equals(list.get(i)))
           {
              list.remove(i); //这里应该是list.remove(i--);看来LZ还没有理解透ArrayList的性质,ArrayList是动态进行存储的,当remove掉一个元素后,在操作的元素角标后面的元素会往前移,并且ArrayList的长度会减一。
           }
   }
   System.out.println(list);
回复 使用道具 举报
import java.util.ArrayList;

public class Test{
        public static void main(String []args){
                ArrayList<String>  list = new ArrayList<String>();
                  list.add("java");
                  list.add("abc");
                  list.add("java");
                  list.add("bcd");
                  list.add("java");
                  list.add("java");
                for(int i=0;i<list.size();i++)
                  {
                        if("java".equals(list.get(i).toString()))
                          {
                             list.remove(i);
                             i--;
                          }
                        
                  }
                  System.out.println(list);
        }
}
正如上上楼所说,Arraylist删除后下标减小,所以下表也要减小........{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 新手报到,鼓励一下!

查看全部评分

回复 使用道具 举报
胥江 中级黑马 2012-5-24 20:21:33
8#
那撒没有报下标越界错误!
回复 使用道具 举报
我现在懂了,谢谢大家。
回复 使用道具 举报
呵呵,有问题大家解决就是快啊,,,{:soso_e100:}
回复 使用道具 举报
List集合中的remove()方法是會改變集合長度的,視頻裏面應該說到了吧?
回复 使用道具 举报
呵呵。接下来如果用迭代器的话你就会明白。next()的作用
回复 使用道具 举报
这样的操作,你应该用listIterator来进行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马