2017-05-30 89 views
0
@Override 
     public boolean contains(Object object) { 
      if (object != null) { 
       for (E element : a) { 
        if (object.equals(element)) { 
         return true; 
        } 
       } 
      } else { 
       for (E element : a) { 
        if (element == null) { 
         return true; 
        } 
       } 
      } 
      return false; 
     } 

我正在学习java,并且正在研究源代码以了解如何编写某些方法。我想问一下为什么有必要写Java ArrayList包含方法

else { 
     for (E element : a) { 
      if (element == null) { 
       return true; 
      } 
     } 
    } 

谢谢

+0

因为那是在这种情况下如何处理null。并且在'null'上调用'.equals'不会结束。 – luk2302

+0

如果测试List是否包含空对象,那么else部分就在这里。在这种情况下,该方法将迭代List,如果发现null元素则返回true。 – Kaiserbogey

+0

我们不能使用'null.equals(element)',因为'null'没有包含'equals'的任何方法。这样的执行会抛出我们不想要的'NullPointerException'。为了比较空值,我们使用'=='。 – Pshemo

回答

6

是的,有。

如果objectnullobject.equals(element)将抛出一个NullPointerException

所以的情况下objectnull在一个单独的循环处理。

1

输入参数可以是null或不是null。 如果它是null那么我们需要迭代所有列表元素,并且如果数组中存在null,则返回true。 而我们必须使用==算子,因为equals会丢NullPointerException

+0

@ luk2302,我的错误 – vhula

+0

ArrayList可以有零和Integer.MAX_VALUE'null'引用之间的任何地方。不是“完全一个”。 –

+0

@ErwinBolwidt,谢谢。我删除了那条语句 – vhula

0

在这种情况下实施,以检查你的方法,如果对象值null与否,如果是nullreturn true否则false。实施此方法使您有机会检查任何object(传递对象作为参数)值(使用if条件或任何其他条件)。稍后当你想检查值是否存在,如果它有价值,你可以做对象的操作。

在ArrayList的:

如果此列表包含指定的元素的ArrayList.contains(Object)方法返回true

ArrayList<Integer> listObj = new ArrayList<Integer>(); 
listObj.add(1); 
listObj.add(2); 

System.out.println("Contains : "+listObj.contains(1)); 

这种方法更重要检查元素,并做somework如果true。作为一个例子,

if(listObj.contains(2)){ 
    int index=arrlist.indexOf(2); 
    listObj.remove(index); 
} 

这到底是怎么发生的是,值(对象)作为参数传递是不是空值,

public boolean contains(Object object) { 
    if (object != null) { 

然后通过ArrayList的元素,

for (E element : a) { 

等于传递值,

if (object.equals(element)) { 

返回true

否则(如果对象是null)则使用else块。

抛出

ClassCastException - 如果指定元素的类型和此列表不兼容。

NullPointerException - 如果指定元素为空,并且此列表不允许空元素。

read more


假设对象是String

这方法也String类。有点不同的情况,但概念是相同的。

当你想检查一个String是否包含特定的子字符串。

String word= "Hey there how are you"; 
if(word.contains("you")){ 
    System.out.println("I am fine!"); 
} 
0

我想问一下为什么有必要写

else { 

[...]

因为否则,该方法将总是在返回false事件说明if声明(object != null)的条件未得到满足,但与方法的合同/文档不一致ñ。许多Java List实现可以包含值null作为元素,并且当它们执行时,contains(null)必须为它们返回true

即在一个单独的分支处理,因为当objectnull,任何试图调用一个方法就可以了,如equals()将导致NullPointerException被抛出。因此if块中的方法不适用于这种情况。

+0

if object == null and element == null then then true; –

+0

@RDR我看不到你在找什么。 –

0

List是一个允许插入空引用对象的集合。

意味着要告诉你,如果你有列表至少空和你问/搜索空对象后,然后它会在第一次比赛返回true算法....

0

因为.equals()比较方法不能在null上调用,如果你调用的话null.equals(SOMETHING);会抛出NullPointerException。所以这里传统的方式来拯救!使用==比较运算符。

0

集合框架接口中的许多方法是根据equals方法定义的。例如,contains(Object o)方法的规范说:“当且仅当此集合包含至少一个元素e以使((o == null?e == null:o.equals(e)) “。本规范不应被解释为暗示使用非空参数调用Collection.contains o将导致任何元素e被调用o.equals(e)。实现可以自由地实现优化,从而避免了equals调用,例如,首先比较两个元素的哈希代码。 (Object.hashCode()规范保证两个哈希代码不相等的对象不能相等)。更一般地说,不同的集合框架接口的实现可以自由地利用底层Object方法的指定行为,无论实现者认为合适。

参见:https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html

0

有必要写else { ...,因为如果条件成立仅当ARG“对象”不为空。