当前位置: 首页 > 面试题库 >

为什么List.add(E)返回布尔值,而List.Add(int,E)返回void?

吉凯捷
2023-03-14
问题内容

查看javadoc,我看到ArrayList有一个重载的add方法:

public boolean add(E e)

将指定的元素追加到此列表的末尾。

public void add(int index,E元素)

将指定的元素插入此列表中的指定位置。将当前在该位置的元素(如果有)和任何后续元素右移(将其索引添加一个)。

我注意到第一个返回了一个,boolean而第二个返回了一个void。事实证明,第一个addHAS返回a的boolean原因是:

返回:true(由Collection.add(E)指定)

所以我去了Collection.add(E):

布尔值add(E e)

确保此集合包含指定的元素(可选操作)。如果此集合由于调用而更改,则返回true。(如果此集合不允许重复并且已经包含指定的元素,则返回false。)

所以我的问题是,为什么add指定要返回布尔值而不是空值?当我add做某事时,我希望只做一个手术。

我知道,与ArrayList相比,还有其他数据结构不允许重复(例如集合)。但是即使那样,也无法通过以下方式解决问题:

public void add(E e){
    if(e is not in set){
        add e;
    }
}

这样,如果eIS在集合中,则不采取任何措施。为什么最好返回a boolean而不是void方法?


问题答案:

Collection.add是一种非常通用的方法(就Java通用而言,不是广泛应用的意义)。因此,他们想要一个通常适用的返回值。

有些类(如ArrayList)总是接受元素,因此总是会返回true。您是对的,在这种情况下,返回类型也是void一样的。

但是其他类似Set的元素有时会不允许添加元素。在Set的情况下,如果已经存在相等的元素,则会发生这种情况。知道这一点通常很有帮助。另一个示例是有界集合(只能容纳一定数量的元素)。

您可能会问:“编写代码是否只能手动进行检查?” 例如,带有一组:

if (!set.contains(item)) {
    set.add(item);
    itemWasAdded(item);
}

这比您现在可以做的要冗长得多,但不是很多:

if (set.add(item)) {
    itemWasAdded(item);
}

但是,这种先检查后行动的行为不是线程安全的,这在多线程应用程序中可能至关重要。例如,可能是另一个线程在您检查set.contains(item)set.add(item)第一个代码段中的之间添加了相等的项。在多线程方案中,这两个动作实际上需要是一个单独的原子动作。boolean从方法返回使之成为可能。



 类似资料:
  • 查看javadoc,我看到ArrayList有一个重载的add方法: 公共布尔加法(E E) 将指定的元素追加到此列表的末尾。 所以我去了收藏。添加(E): 布尔加法 确保此集合包含指定的元素(可选操作)。如果此集合由于调用而更改,则返回true。(如果此集合不允许重复并且已包含指定的元素,则返回false。) 这样,如果在集合中,则不采取任何操作。为什么返回而不是方法更好呢?

  • 我觉得这给了我很小的灵活性每当我使用这个函数。使用此函数时,我通常会查找元素的第一次出现,但它只返回,我发现这一点有些欠缺。 使用此函数的主要原因是每当找到元素时,都会循环,因此使用会失去作用,因为不会短路。是相同的。 我是遗漏了什么,还是必须使用循环来获取JavaScript中的第一个匹配元素?

  • 为什么numeric_limits::min返回一个负值为int,但正值为例如浮动和双? 输出: 参考文献: 返回可由数字类型T表示的最小有限值。 对于具有反规范化的浮点类型,min返回最小的正规范化值。请注意,这种行为可能是意外的,特别是与整型类型的min行为相比。要查找没有值小于它的值,请使用。 min仅对有界类型和无界无符号类型有意义,也就是说,表示无穷多个负值的类型没有意义的最小值。

  • 我有一个布尔方法正在对字符串进行一些错误检查。我有一个int类常量叫“numwords”=8。我将一个字符串传递给布尔方法,在该方法中,我使用.split和.length对字符串进行单词计数。一个名为“words”的int计算字符串中的单词数。完成之后,我要执行一个if语句,比较单词和数字单词。如果它们的数目相等,则返回true,否则为false。我试过==和.等于,但都没用。有什么想法吗? 我试

  • 这是一个布尔方法,是我作业的一小部分。我想根据输入和记录之间是否匹配来返回true或false。我想我遇到了语法问题。 这是该方法的代码,但始终有红线指示我应该在代码中添加return,否则将该方法更改为void。但我已经在if语句中添加了return true。

  • 问题内容: 为什么不: 代替: 获得唯一哈希码的更高机会? 问题答案: 因为数组的最大长度为。 由于的主要用途是确定将对象插入/ 的后备数组中的哪个插槽,因此hashcode> 将无法存储在该数组中。