刚拿着你的代码做了一下输出测试- public static void main(String[] args) {
- List list1 = new ArrayList();
- list1.add(new Person("刘育郡", 21));
- list1.add(new Person("孙雪娇", 18));
- list1.add(new Person("杨丛玮", 21));
- list1.add(new Person("唐中玉", 21));
- list1.add(new Person("崔瑞龙", 20));
- List list2 = new ArrayList();
- for (int i = 0; i < list1.size(); i++) {
- Person p = (Person) list1.get(i);
- if (p.getAge() == 21) {
- list2.add(p);
- System.out.println(i);
- list1.remove(i--);
- System.out.println(i);
- }
- }
- }
复制代码 结果是:
0
-1
1
0
1
0
解释:当 p.getAge() == 21 符合条件 也就是这个Person("刘育郡", 21)符合条件 list2就把这个对象添加进去,在list1中删除这个对象,删除了这个对象。
而Person("刘育郡", 21)这个对象的标号是 0 的,当list1删除了 Person("刘育郡", 21) 后 Person("孙雪娇", 18)的下标就变成0了 而此时如没有那个i--,
i 通过for里面的i++变成了1 , 从而 Person("刘育郡", 21) 这个对象就被漏掉了
数组中的一个元素被删了,后面的元素向前移动了一个位置,此时下标不再需要+1了 理解了没?- public static void main(String[] args) {
- List list1 = new ArrayList();
- list1.add(new Person("刘育郡", 21));
- list1.add(new Person("孙雪娇", 18));
- list1.add(new Person("杨丛玮", 21));
- list1.add(new Person("唐中玉", 21));
- list1.add(new Person("崔瑞龙", 20));
- List list2 = new ArrayList();
- for (int i = 0; i < list1.size(); i++) {
- Person p = (Person) list1.get(i);
- if (p.getAge() == 21) {
- list2.add(p);
- System.out.println(i);
- list1.remove(i--);
- System.out.println(i);//测试 i 的输出
- }
- }
- }
复制代码 其实这里的list1.remove方法在这个程序中并没什么实际大的作用
完全可以直接遍历- public static void main(String[] args) {
- List list1 = new ArrayList();
- list1.add(new Person("刘育郡", 21));
- list1.add(new Person("孙雪娇", 18));
- list1.add(new Person("杨丛玮", 21));
- list1.add(new Person("唐中玉", 21));
- list1.add(new Person("崔瑞龙", 20));
- List list2 = new ArrayList();
- for (int i = 0; i < list1.size(); i++) {
- Person p = (Person) list1.get(i);
- if (p.getAge() == 21) {
- list2.add(p);
- }
- }
- for (int i = 0; i < list2.size(); i++) {
- System.out.println(((Person) list2.get(i)).getName());
- }
- }
复制代码 |