坑——java里List的remove方法

2023年2月11日08:25:25

写过的类似代码:

/**
 * 2018年5月20日上午9:54:02
 */
package com.test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author xinwenfeng
 *
 */
public class TestListRemove {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<Integer> ageList = new ArrayList<>();
		Student stu1 = new Student(7, "Tom");
		Student stu2 = new Student(6, "Jerry");
		Student stu3 = new Student(4, "Mordecai");
		Student stu4 = new Student(5, "Lilith");
		Student stu5 = new Student(8, "Roland");
		Student stu6 = new Student(9, "Brick");
		ageList.add(stu1.getAge());
		ageList.add(stu2.getAge());
		ageList.add(stu3.getAge());
		ageList.add(stu4.getAge());
		ageList.add(stu5.getAge());
		ageList.add(stu6.getAge());
		System.out.println(ageList);
		//删掉Lilith,age=5
		ageList.remove(stu4.getAge());
		System.out.println(ageList);//发现删掉的是stu6
		//删掉Roleand,age=8
//		ageList.remove(stu5.getAge());//Exception:java.lang.IndexOutOfBoundsException: Index: 8, Size: 5
		//正确删掉Jerry
		ageList.remove((Integer)stu2.getAge());
		System.out.println(ageList);
	}

}
class Student{
	private int age;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	private String name;
	public Student(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	@Override
	public String toString() {
		return age+":"+name;
	}
}

结果:

坑——java里List的remove方法

发生这样的bug经常要找很久,因为自认为list是按照age塞进去的,按照age删肯定没问题,通常也不会想到这样的bug而优先去找业务逻辑的bug,出现这种问题的原因就在list的remove方法有两个:

boolean 
java.
util.
List.remove(

Object o)
Integer 
java.
util.
List.remove(
int index)

Student的age属性是int而不是Integer,所以remove(stu.getAge())的时候传递的是int,调用的是remove(int index)方法,根据索引删除,这样造成两种结果:删错(删掉Lilith)、异常(删掉Roland)。要正常删除应把age转型成Integer对象,调用remove(Object)方法而不是remove(int)。

  • 作者:FlyLikeButterfly
  • 原文链接:https://blog.csdn.net/FlyLikeButterfly/article/details/80380238
    更新时间:2023年2月11日08:25:25 ,共 1590 字。