ArrayList.remove不使用Integer,使用常量

时间:2016-01-22 05:58:08

标签: java arraylist

好吧,我是Java的新手,我只是在上课,而且我在课堂上遇到了一些障碍。除了最后一件事,我已经成功地完成了我的最终计划的每一个方面。

public static void remove(String studentID)
{
Integer foundLocation = 0;

for (int i = 0; i < studentList.size(); i++)        
    {
        if (studentList.get(i).getStudentID().compareTo(studentID) == 0)
            {
                //This means we have found our entry and can delete it
                foundLocation = i;

            }
    }
System.out.println(foundLocation);
if (foundLocation != 0)
    {
        System.out.println(studentList);

        studentList.remove(foundLocation);
        System.out.println(foundLocation.getClass().getName());


        System.out.println("Student ID removed: " + studentID);
        System.out.println(studentList);
    }
else
    {
        System.out.println("Sorry, " + studentID + " not found.");
    }

代码似乎应该有用。但是,我得到的是remove实际上并没有做任何事情。我的额外打印件在那里验证。 ArrayList只是平原没有变化。

但是,如果我只是替换:

studentList.remove(foundLocation);

有类似的东西:

studentList.remove(3);

它完全消除了。

foundLocationInteger

有人可以向我解释我在这里发生了什么吗?

对于熟悉Java的人来说,我觉得这很明显,但是我很想念它。

3 个答案:

答案 0 :(得分:3)

这是一个令人讨厌的重载,它隐藏在Collections API设计中。

有两种remove方法,一种是使用int调用的方法,另一种是使用Object调用的方法,它们执行的操作非常不同。

不幸的是,Integer也是Object,即使您想将其用作int(并在其他几个地方使用它,感谢不幸的是,自动装箱不适用于remove)。

remove(1)将按索引删除(第二个元素)。

remove(Integer.valueOf(1))将删除对象的值(列表中的第一个“1”)。

将这两种方法赋予两种不同的名称可能更明智。

在您的情况下,请将foundPosition更改为int

答案 1 :(得分:0)

ArrayList有两个remove方法,一个是remove(int index),另一个是remove(Object object), 您的foundLocation类型为Integer,在使用时它将作为参考,因此当您致电remove(foundLocation)时,它会调用remove(Object),尝试查找元素== foundLocation,它找不到这个删除什么,一旦你将类型更改为int,它将删除index foundLocation中的元素,请参考方法doc

答案 2 :(得分:0)

有两个&#39;删除&#39; ArrayList类中的方法。一个接受Object类型,另一个接受int类型。通过使用Integer对象,您将在列表中找到一个等于Integer对象的元素。但是,当您按int类型删除时,您将按列表中元素的位置移动。

studentList.remove(foundLocation)将导致ArrayList检查Integer对象,该对象等于foundLocation引用的对象。这是对象相等性检查。具有相同值的两个不同的Integer对象被认为是不同的,即使它们具有相同的数值。

studentList.remove(3)将导致ArrayList删除列表中的第四个元素。