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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭润生 中级黑马   /  2012-9-19 21:24  /  2621 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 彭润生 于 2012-9-19 22:43 编辑

public class Demo{
public static void main(String[] args)throws Exception{
  List<String> l = new ArrayList<String>();
  l.add("Java08");
  l.add("Java07");
  l.add("Java06");
  l.add("Java05");
for(int x = 0;x<l.size();x++){
  l.remove(x);
}
System.out.println(l);
}
把集合里面的元素移除完了,怎么还有元素啊?
下面是结果,为什么啊.里面还有元素啊??
[Java07, Java05]

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

15 个回复

倒序浏览
不能这么移除。
你吧size变量定义在外面,然后用那个变量来移除
int num=l.size();
for(int x = 0;x<num;x++){
改成这样

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你用for循环去移除元素。
开始时,list中有4个,“8 7 6 5”,你移除第0个,list变为“7 6 5”,x++变为1,size此时为3;然后你移除第1个,list变为“7 5”,x++变为2,size此时为2;所以不会再循环下去。

最后还剩两个元素“7 5”

你是没明白remove方法。建议看下API

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
疯子雨 发表于 2012-9-19 21:35
不能这么移除。
你吧size变量定义在外面,然后用那个变量来移除
int num=l.size();

这样抛异常
回复 使用道具 举报
张 涛 发表于 2012-9-19 21:37
你用for循环去移除元素。
开始时,list中有4个,“8 7 6 5”,你移除第0个,list变为“7 6 5”,x++变为1, ...

呵呵,知道remove返回移除的值。我在去看看。
回复 使用道具 举报
在说了 移除集合的元素也没必要那样移除,直接调用方法就行

深深深.jpg (5.68 KB, 下载次数: 71)

深深深.jpg
回复 使用道具 举报
  1. import java.util.*;

  2. public class Demo{
  3.         public static void main(String[] args)throws Exception
  4.         {
  5.           List<String> l = new ArrayList<String>();
  6.           l.add("Java08");
  7.           l.add("Java07");
  8.           l.add("Java06");
  9.           l.add("Java05");
  10.           ListIterator li = l.listIterator();
  11.           while(li.hasNext())
  12.           {
  13.                   li.next();
  14.                   li.remove();
  15.           }
  16.           System.out.println(l);
  17. }
复制代码
用ListIterator吧,它里面有自己的移除方法。而你的问题应该是,循环操作时,使用了容器的方法操作,
导致你的size()大小变化了,所以一般不要并发修改,要么用容器的方法,要么都用迭代器的方法。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public class Demo{
public static void main(String[] args)throws Exception{
  List<String> l = new ArrayList<String>();
  l.add("Java08");
  l.add("Java07");
  l.add("Java06");
  l.add("Java05");
for(int x = 0;x<l.size();x++){  //原因在这里,每一次remove()后,对象l.size()就发生一次变化
  l.remove(x);
}
System.out.println(l);
}
把集合里面的元素移除完了,怎么还有元素啊?
下面是结果,为什么啊.里面还有元素啊??
解答:原因在这里,每一次remove()后,对象l.size()就发生一次变化~你可以自己测试一下:
for(int x = 0;x<l.size();x++)
    {   System.out.println("大小:"+l.size());
        System.out.println(x);
        System.out.println(l.get(x));
        l.remove(x);
    }

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为集合是可变长度的,当你第一次删除的时候,假如你删掉了java08,这时候i++就是1了指针指向了第2个位置。但是由于集合的特性,长度变成了3 整体向前移一位,指针相当于指向了java06,这时候就把java06删去了  i在++的时候,同时集合元素整体再向前移一位,这时候指针指不到元素了
你应该写成这样for(int i=0;i<l.size();i++){l.remove(i--);}这就保证了永远指针能指向每一个元素,
鉴于本人画图不够熟练 希望 文字你能明白点!!!
回复 使用道具 举报
张 涛 发表于 2012-9-19 21:37
你用for循环去移除元素。
开始时,list中有4个,“8 7 6 5”,你移除第0个,list变为“7 6 5”,x++变为1, ...

明白了,呵呵谢谢
回复 使用道具 举报
武庆东 发表于 2012-9-19 21:48
public class Demo{
public static void main(String[] args)throws Exception{
  List l = new ArrayList( ...

了解了,哈哈
回复 使用道具 举报
赵永康 发表于 2012-9-19 21:54
因为集合是可变长度的,当你第一次删除的时候,假如你删掉了java08,这时候i++就是1了指针指向了第2个位置 ...

明白了,呵呵
回复 使用道具 举报
第一个是因为每次循环的时候,list的长度都在变化,所以导致你只删了两个就停止了。

第二个你是想说插入到指定位置吗,需要加参数的 参数类型如下:

add(int index, E element)
          在列表的指定位置插入指定元素(可选操作)。
回复 使用道具 举报
张小龙 发表于 2012-9-19 22:07
第一个是因为每次循环的时候,list的长度都在变化,所以导致你只删了两个就停止了。

第二个你是想说插入到 ...

大意了。知道了哈
回复 使用道具 举报
import java.util.*;
public class Demo
{
        public static void main(String[] args)throws Exception
        {
                  List<String> l = new ArrayList<String>();
                  l.add("Java08");
                  l.add("Java07");
                  l.add("Java06");
                 l.add("Java05");
                for(int x = 0;x<l.size();x++)
                {
                          l.remove(x);
                }
                System.out.println(l);
        }
}
每移除一次,l.size()值就减一所以导致那样的结果
可以使用迭代器
回复 使用道具 举报
明光照 来自手机 中级黑马 2012-9-20 10:28:35
16#
直接用Removeall()方法不行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马