Я храню Целочисленные объекты, представляющие индекс объектов, которые я хочу отследить. Позже в моем коде я хочу проверить, чтобы видеть, соответствует ли индекс конкретного объекта одному из тех Целых чисел, я сохранил ранее. Я делаю это путем создания ArrayList и создания нового Целого числа из индекса для цикла:
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)
, это совпадет с ранее созданным Целочисленным объектом, если международное значение, используемое для создания их, будет тем же?
Я надеюсь, что не сделал это слишком неясным. Спасибо за справку!
Да, вы можете использовать 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 Collections, интерфейсного типа, а не конкретного типа, так:
List<Integer> courseselectItems = new ArrayList();
not
ArrayList<Integer> courseselectItems = new ArrayList();
Короткий ответ - да, вы должны быть в состоянии сделать ArrayList.contains(new Integer(14))
, например, чтобы увидеть, есть ли 14 в списке. Причина в том, что Integer переопределяет метод equals
для корректного сравнения себя с другими экземплярами с тем же значением.
Как упомянули Клетус и 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
}
Да будет, потому что List.contains()
использует метод equals()
сравниваемого объекта. А Integer.equals()
действительно сравнивает целочисленное значение.
Да, автоматическая упаковка происходит, но это приводит к снижению производительности. Из вашего примера не ясно, почему вы хотите решить проблему таким образом.
Кроме того, из-за бокса создание класса Integer вручную является излишним.
Я выражаю свой ответ в форме (проходного) теста, как пример того, как вы могли бы исследовать это самостоятельно. Чтобы не отговаривать вас от использования SO - это здорово - просто чтобы попытаться продвинуть характеристические тесты .
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)));
}
}
Мой вопрос: когда я создаю новое целое число, используя новое целое число ( i) смогу ли я сравнивать целые числа с помощью ArrayList.contains ()? То есть, когда я создаю новый объект с помощью new Integer (i), будет ли он таким же, как ранее созданный объект Integer, если значение int, используемое для их создания, такое же?
Короткий ответ - да.
Длинный ответ ...
То есть, когда я создаю новый объект, используя new Integer (i), будет таким же, как ранее созданный объект Integer, если Значение int, используемое для их создания, такое же?
Я полагаю, вы имеете в виду "... это будет тот же экземпляр , что и ..." ? Ответ на этот вопрос - нет - вызов new
всегда будет создавать отдельный экземпляр, отдельный от предыдущего, даже если параметры конструктора идентичны.
Однако, несмотря на наличие отдельных идентификаторов , эти два объекта будут иметь эквивалентное значение , т.е. вызов .equals () между ними вернет истину.
Collection.contains ()
Оказывается, наличие отдельных экземпляров эквивалентного значения ( .equals () возвращает true ) - это нормально. Метод .contains ()
находится в интерфейсе Collection
. Описание Javadoc для .contains ()
говорит:
http://java.sun.com/javase/6/docs/api/java/util/Collection.html#contains (java.lang .Object)
boolean contains (Object o)
Возвращает истину, если эта коллекция содержит указанный элемент. Более того, формально возвращает истину тогда и только тогда, когда эта коллекция содержит хотя бы один элемент e такой, что (o == null? E == null : o.equals (e)) .
Таким образом, он будет делать то, что вы хотите.
Структура данных
Вам также следует подумать, есть ли у вас правильная структура данных.
Список касается исключительно сдерживания? порядок важен? Вы заботитесь о дубликатах? Поскольку список является порядком, использование списка может означать, что ваш код заботится о порядке. Или что вам нужно поддерживать дубликаты в структуре данных.
Однако, если порядок не важен, если вы не хотите или не имеете дубликатов, и если вы действительно используете эту структуру данных только для проверки наличия определенного значения, затем вы можете хотите решить, следует ли использовать вместо него Set .