比较ArrayList问题中的新整数对象

时间:2010-04-13 23:24:10

标签: java integer arraylist

我正在存储表示我想要跟踪的对象索引的Integer对象。稍后在我的代码中,我想检查特定对象的索引是否对应于我之前存储的那些整数之一。我这样做是通过创建一个ArrayList并从for循环的索引创建一个新的Integer:

ArrayList<Integer> courseselectItems = new ArrayList();

//Find the course elements that are within a courseselect element and add their indicies to the ArrayList
for(int i=0; i<numberElementsInNodeList; i++) {
    if (nodeList.item(i).getParentNode().getNodeName().equals("courseselect")) {
        courseselectItems.add(new Integer(i));
    }
}

然后我想稍后检查ArrayList是否包含特定索引:

//Cycle through the namedNodeMap array to find each of the course codes
for(int i=0; i<numberElementsInNodeList; i++) {
    if(!courseselectItems.contains(new Integer(i))) {
        //Do Stuff
    }
}

我的问题是,当我使用new Integer(i)创建新的整数时,我能够使用ArrayList.contains()比较整数吗?也就是说,当我使用new Integer(i)创建一个新对象时,如果用于创建它们的int值相同,那么它是否与先前创建的Integer对象相同?

我希望我没有把它弄得太清楚。谢谢你的帮助!

7 个答案:

答案 0 :(得分:18)

是的,您可以使用List.contains()使用equals()Integer支持与其他Integer进行比较。

此外,由于自动装箱,你可以简单地写:

List<Integer> list = new ArrayList<Integer>();
...
if (list.contains(37)) { // auto-boxed to Integer
  ...
}

值得一提的是:

List list = new ArrayList();
list.add(new Integer(37));
if (list.contains(new Long(37)) {
  ...
}

始终返回false,因为Integer不是Long。这会使某些人在某些时候绊倒。

最后,尝试使您的变量作为接口类型的Java集合而不是具体类型:

List<Integer> courseselectItems = new ArrayList();

ArrayList<Integer> courseselectItems = new ArrayList();

答案 1 :(得分:4)

  

我的问题是,当我使用new Integer(i)创建一个新的Integer时,我能用ArrayList.contains()来比较整数吗?也就是说,当我使用new Integer(i)创建一个新对象时,如果用于创建它们的int值相同,那么它是否与先前创建的Integer对象相同?

简短的回答是肯定的。

答案很长......

  

也就是说,当我使用new Integer(i)创建一个新对象时,如果用于创建它们的int值相同,将与先前创建的Integer对象相同

我认为你的意思是“......那个实例会是......”吗?答案是 - 调用new将始终创建与前一个实例分开的独特实例,即使构造函数参数相同。

但是,尽管有单独的标识,但这两个对象将具有等效值,即在它们之间调用.equals()将返回true。

<强> Collection.contains()

事实证明,拥有等效值的单独实例( .equals()返回true )是可以的。 .contains()方法位于Collection界面中。 .contains()的Javadoc描述说:

http://java.sun.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object)

  

布尔包含(对象o)

     
    

如果此集合返回true     包含指定的元素。更多     正式地,当且仅当如果,则返回true     此集合包含至少一个     元素e使得(o == null?e == null     : o.equals(e))

  

因此,它会做你想做的事。

数据结构

您还应该考虑是否拥有正确的数据结构。

该清单仅仅是关于收容吗?订单重要吗?你关心重复吗?由于列表是订单,使用列表可能意味着您的代码关心订购。或者您需要在数据结构中保留重复项。

但是,如果订单不重要,如果您不想要或不会有重复项,并且如果您真的只使用此数据结构来测试是否包含特定值,那么您可能想要考虑是否应该使用Set

答案 2 :(得分:1)

简短回答是肯定的,例如,您应该可以ArrayList.contains(new Integer(14))查看列表中是否有14。原因是Integer重写了equals方法,以便与具有相同值的其他实例正确地进行比较。

答案 3 :(得分:1)

是的,因为List.contains()使用对象的equals()方法进行比较。并且Integer.equals()会比较整数值。

答案 4 :(得分:1)

正如cletus和DJ所说,你的方法会有效。

我不知道您的代码的上下文,但如果您不关心特定索引,请考虑以下样式:

List<Node> courseSelectNodes = new ArrayList<Node>();

//Find the course elements that are within a courseselect element 
//and add them to the ArrayList
for(Node node : numberElementsInNodeList) {
    if (node.getParentNode().getNodeName().equals("courseselect")) {
        courseSelectNodes.add(node);
    }
}

// Do stuff with courseSelectNodes
for(Node node : courseSelectNodes) {
    //Do Stuff
}

答案 5 :(得分:1)

我以(通过)测试的形式给出了答案,作为您自己如何研究这个问题的一个例子。不要阻止你使用SO - 这很棒 - 只是为了尝试宣传characterization tests

import java.util.ArrayList;
import junit.framework.TestCase;

public class ContainsTest extends TestCase {
    public void testContains() throws Exception {
        ArrayList<Integer> list = new ArrayList<Integer>();
        assertFalse(list.contains(new Integer(17)));
        list.add(new Integer(17));
        assertTrue(list.contains(new Integer(17)));
    }
}

答案 6 :(得分:0)

是的,会发生自动装箱,但这会导致性能下降。从你的例子中不清楚为什么你想以这种方式解决问题。

另外,由于拳击,手动创建Integer类是多余的。