下面一代java代码,问题写在注释中,请高手解答.
importjava.util.ArrayList;importjava.util.List;publicclassListDemo01{publicstaticvoid...
import java.util.ArrayList;
import java.util.List;
public class ListDemo01{
public static void main(String[] args){
List<Integer> lists = null;
lists = new ArrayList<Integer>();
lists.add(1);
lists.add(1);
lists.add(2);
lists.add(2);
lists.add(3);
lists.add(3);
lists.add(4);
lists.add(4);
lists.add(5);
lists.add(5);
lists.add(6);
lists.add(6);
lists.add(7);
lists.add(7);
lists.add(8);
lists.add(8);
for(int i = 0; i<lists.size();i++){
System.out.println(lists.get(i)); //运行结果是1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8
}
lists.remove(0);
lists.remove(1);
lists.remove(2);
lists.remove(3);
lists.remove(4);
System.out.println("删除之后-------");
for(int i = 0;i<lists.size();i++){
System.out.println(lists.get(i)); //删除之后应该是输出3 4 4 5 5 6 6 7 7 8 8才对啊,怎么是1 2 3 4 5 6 6 7 7 8 8 呢
}
}
} 展开
import java.util.List;
public class ListDemo01{
public static void main(String[] args){
List<Integer> lists = null;
lists = new ArrayList<Integer>();
lists.add(1);
lists.add(1);
lists.add(2);
lists.add(2);
lists.add(3);
lists.add(3);
lists.add(4);
lists.add(4);
lists.add(5);
lists.add(5);
lists.add(6);
lists.add(6);
lists.add(7);
lists.add(7);
lists.add(8);
lists.add(8);
for(int i = 0; i<lists.size();i++){
System.out.println(lists.get(i)); //运行结果是1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8
}
lists.remove(0);
lists.remove(1);
lists.remove(2);
lists.remove(3);
lists.remove(4);
System.out.println("删除之后-------");
for(int i = 0;i<lists.size();i++){
System.out.println(lists.get(i)); //删除之后应该是输出3 4 4 5 5 6 6 7 7 8 8才对啊,怎么是1 2 3 4 5 6 6 7 7 8 8 呢
}
}
} 展开
6个回答
展开全部
//这是orcale jdk7的源码,我加了点注释,看明白了你就知道remove是如何工作的了
public E remove(int index) {
rangeCheck(index); // 检查给的index是否合法
modCount++;
E oldValue = elementData(index); //取出下标对应的对象
int numMoved = size - index - 1; // 计算需要移动的位数
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved); //将后面的所有元素都向前移动一位
elementData[--size] = null; // clear to let GC do its work,将最后一位赋值为null以便垃圾回 // 收器回收
return oldValue;
}
public E remove(int index) {
rangeCheck(index); // 检查给的index是否合法
modCount++;
E oldValue = elementData(index); //取出下标对应的对象
int numMoved = size - index - 1; // 计算需要移动的位数
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved); //将后面的所有元素都向前移动一位
elementData[--size] = null; // clear to let GC do its work,将最后一位赋值为null以便垃圾回 // 收器回收
return oldValue;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
list里面当你remove之后,后面的元素会自动往前填充,就是你remove(0)之后,你的第二个1会填充到第0个位置上,然后list总长度也会跟着减1,所以你这段remove之后输出的结果才会是这样的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
lists.remove(0)执行删除的是第一个元素,此时list整体向前移动一个位置,所以 lists.remove(1)执行删除的是新的list的第二个元素,依次类推会得到后面的结果,所以在执行一次remove后list会变动,remove是不稳定的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
主要是 你remove 的时候 list 就直接删掉了,长度就剪短了,等你再次删除的时候 你原来第二个就已经变成了第一个 ,等你去删除第二个的时候其实你删的就是第三个了,依次类推。解决方法 ,可以 另外定义一个 list 把你要删除的元素加入进去,然后用lists.removeAll(list)进行批量删除。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-01-17
展开全部
.对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动
所以如果想实现 3 4 4 5 5 6 6 7 7 8 8
lists.remove(0);
lists.remove(1);
lists.remove(0);
lists.remove(0);
lists.remove(0);
所以如果想实现 3 4 4 5 5 6 6 7 7 8 8
lists.remove(0);
lists.remove(1);
lists.remove(0);
lists.remove(0);
lists.remove(0);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询