我正在存储表示我想要跟踪的对象索引的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对象相同?
我希望我没有把它弄得太清楚。谢谢你的帮助!
答案 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类是多余的。