使用List.contains(Object object)方法判断ArrayList是否包含一个元素对象(针对于对象的属性值相同,但对象地址不同的情况),如果没有重写List<E>的元素对象Object中的equals方法,默认如下:
@Override public boolean equals(Object o) { // TODO Auto-generated method stub return super.equals(o); }
将导致contains方法始终返回false。
查看ArrayList的contains方法的源码如下:
/** * Searches this {@code ArrayList} for the specified object. * * @param object * the object to search for. * @return {@code true} if {@code object} is an element of this * {@code ArrayList}, {@code false} otherwise */ @Override public boolean contains(Object object) { Object[] a = array; int s = size; if (object != null) { for (int i = 0; i < s; i++) { if (object.equals(a[i])) { return true; } } } else { for (int i = 0; i < s; i++) { if (a[i] == null) { return true; } } } return false; }
可以看出,contains方法依据Object的equals方法来判断是否包含某一元素,继续查看Object类中的equals方法,源码如下:
public boolean equals(Object o) { return this == o; }
所以,使用“==”比较对象的地址,如果是同一对象即地址相同的情况下,才会返回true,而对于对象属性值相同但地址不同的不同对象,始终返回false!
如果需要依据对象属性值是否相同来判断ArrayList是否包含某一对象,则需要重写Object的equals方法,并在equals方法中一一比较对象的每个属性值,如:
public class QuestionInfo { private String questionId; private String answerId; private String subQuestionId; private String result; public QuestionInfo() { super(); } public QuestionInfo(String questionId, String answerId, String subQuestionId, String result) { super(); this.questionId = questionId; this.answerId = answerId; this.subQuestionId = subQuestionId; this.result = result; } public String getQuestionId() { return questionId; } public void setQuestionId(String questionId) { this.questionId = questionId; } public String getAnswerId() { return answerId; } public void setAnswerId(String answerId) { this.answerId = answerId; } public String getSubQuestionId() { return subQuestionId; } public void setSubQuestionId(String subQuestionId) { this.subQuestionId = subQuestionId; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } @Override public boolean equals(Object o) { if (o instanceof QuestionInfo) { QuestionInfo question = (QuestionInfo) o; return this.questionId.equals(question.questionId) && this.subQuestionId.equals(question.subQuestionId) && this.answerId.equals(question.answerId) && this.result.equals(question.result); } return super.equals(o); } @Override public String toString() { return "QuestionInfo [questionId=" + questionId + ", answerId=" + answerId + ", subQuestionId=" + subQuestionId + ", result=" + result + "]"; } }
PS:《浅谈Arrays.asList()方法的使用》一文有用到List.contains,有兴趣的可以阅读。
文章来源:https://blog.csdn.net/growing_tree/article/details/46622579
相关推荐
在C#编程中,`List<T>` 是一个非常常用的集合类,它提供了丰富的操作方法,如查找、添加、删除等。在本篇文章中,我们将详细探讨`List<T>`的`FindAll`方法,并通过四种不同的写法来演示如何使用这个功能来筛选满足...
### List常用方法详解 在Java编程语言中,`List`接口是集合框架的重要组成部分,它提供了有序元素集合的实现,并允许重复元素的存在。本文将详细解释`List`接口中的常用方法,帮助开发者更好地理解和运用这些功能...
相等性是基于默认的 `Object.Equals()` 方法,或者是自定义的 `IEqualityComparer<T>` 实现。对于自定义类型,如果你希望使用特定的比较逻辑,确保覆盖 `Equals()` 和 `GetHashCode()` 方法。 `Equals()` 方法: `...
`List`接口还有许多其他方法,如`set(int index, E element)`用于替换元素,`clear()`用于清空列表,`subList(int fromIndex, int toIndex)`用于获取子列表等。理解并熟练运用这些方法,将使你在处理有序集合时更加...
JSONArray jsonArray2 = JSONArray.fromObject( list ); System.out.println( jsonArray2 ); // prints ["first","second"] /*String生成json数组*/ JSONArray jsonArray3 = JSONArray.fromObject( "['...
它的主要方法包括add()(添加元素)、remove()(删除元素)、contains()(判断是否包含指定元素)和get()(获取指定位置的元素)等,这些方法在通讯录操作中都会用到。 4. **LinkedList类**:虽然在这个项目中可能...
@Validated验证List集合的方法示例 在实际开发中,我们经常会遇到需要验证List集合的场景,而@Validated注解只能验证单个实体类,无法直接验证List集合。那么,如何实现List集合的验证呢?下面我们将通过示例代码,...
&& (((LinkTag) url_list.elementAt(i)).getLinkText().contains("下一页") == false)) { i++; } if ((i < url_list.size()) && ((LinkTag) url_list.elementAt(i)).getLinkText().contains("下一页")) { // ...
3. List接口常用方法: - `add(E e)`:向列表末尾添加元素。 - `add(int index, E element)`:在指定位置插入元素。 - `addAll(Collection c)`:将整个集合添加到列表末尾。 - `addAll(int index, Collection c)`:...
判断某个元素是否在该List中:List.Contains(T item)返回true或false,很实用,例如:if (mList.Contains("Hunter")) { Console.WriteLine("There is Hunter in the list"); } else { mList.Add("Hunter"); } List...
相等性是通过默认的 `Object.Equals()` 方法或者自定义的 `IEqualityComparer<T>` 实现来判断的。 如果你正在处理的是基本数据类型(如 int、string 等),`Contains()` 方法会直接使用这些类型的默认相等比较规则...
6. `contains(Object o)`: 检查列表是否包含指定对象。 7. `size()`: 返回列表中的元素数量。 8. `clear()`: 移除列表中的所有元素。 9. `addAll(Collection<? extends E> c)`: 在列表末尾添加另一个集合的所有元素...
7. `contains(Object o)`: 检查列表是否包含特定元素。 8. `indexOf(Object o)`: 返回指定元素的第一个出现的索引,如果不存在则返回-1。 9. `lastIndexOf(Object o)`: 返回指定元素的最后一个出现的索引,如果不...
- `remove(Object o)` 方法:根据对象引用移除第一个匹配的元素,如 `list.remove(new Integer(5))`,这会删除值为5的Integer对象。 3. **修改元素(Update/Replace)** - `set(index, element)` 方法:替换指定...
4. boolean contains(Object o):判断集合中是否持有特定对象的引用 5. Iterator iterator():返回一个 Iterator 对象,可以用来遍历集合中的元素 6. boolean remove(Object o):从集合中删除一个对象的引用 7. int ...
8. `contains(Object o)`: 检查列表是否包含指定元素。 9. `size()`: 返回列表中的元素数量。 10. `clear()`: 移除列表中的所有元素。 11. `isEmpty()`: 检查列表是否为空。 12. `toArray()`: 将列表转换为数组。 `...
可以使用`Collections.synchronizedList(List<T> list)`方法来包装一个线程安全的列表。此外,在多线程环境中,也可以通过显式锁定来实现同步: ```java ArrayList<Integer> list = Collections.synchronizedList...
newList2.contains(integer)) { newList2.add(integer); } } System.out.println("去重后新集合为:" + newList2); } ``` 方法五:Set和List结合 我们可以使用Set和List结合的方式来实现List去重。我们可以将...
- 示例:`boolean hasDog = animallist.contains(new AnimalActor("Dog", "Pet"));` 8. `clear()`: 移除ArrayList中的所有元素。 9. `addAll(Collection<? extends E> c)`: 将指定集合中的所有元素添加到...