android list contain的使用
昨天,自己在公司的開發(fā)中做一個(gè)功能時(shí),需要判斷l(xiāng)ist內(nèi)是否包含一個(gè)object元素,我于是調(diào)用list.contains()的代碼,可是返回的值一直為false,我的list內(nèi)明明包含該object,卻仍然返回false。后來,自己在網(wǎng)上查了資料,發(fā)現(xiàn)問題是由于list.contains()的源碼是通過object的地址判斷的,所以object的內(nèi)容一樣,但是地址不一樣,也會返回false。現(xiàn)在把網(wǎng)上的資料整理一下,避免以后仍需查找。
使用List.contains(Object object)方法判斷ArrayList是否包含一個(gè)元素對象(針對于對象的屬性值相同,但對象地址不同的情況),如果沒有重寫List<E>的元素對象Object中的equals方法,默認(rèn)如下:
?@Override
?public boolean equals(Object o) {
??// TODO Auto-generated method stub
??return super.equals(o);
?}
將導(dǎ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方法依據(jù)Object的equals方法來判斷是否包含某一元素,繼續(xù)查看Object類中的equals方法,源碼如下:
??? public boolean equals(Object o) {
??????? return this == o;
??? }
所以,使用“==”比較對象的地址,如果是同一對象即地址相同的情況下,才會返回true,而對于對象屬性值相同但地址不同的不同對象,始終返回false!
如果需要依據(jù)對象屬性值是否相同來判斷ArrayList是否包含某一對象,則需要重寫Object的equals方法,并在equals方法中一一比較對象的每個(gè)屬性值,如:
package com.feng.lejuan.entity;
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 + "]";
?}
?
}
所以如果需要調(diào)用list.caontains(object)的代碼,必須自己重新該object的equals()代碼,編寫自己認(rèn)為相等的條件,就可以使用了。這次的博客使用到了android 的部分源碼,感覺以前自己很難看懂,但是這次發(fā)行看了后理解起來更容易了。所以大家可以看一些簡單的android 源碼,可以加深對android 的理解。
android list.contains()就這樣講完了。
就這么簡單。
總結(jié)
以上是生活随笔為你收集整理的android list contain的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 阴影效果
- 下一篇: android 获取apk中的素材图片