日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android list contain的使用

發(fā)布時間:2024/4/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android list contain的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

昨天,自己在公司的開發(fā)中做一個功能時,需要判斷l(xiāng)ist內是否包含一個object元素,我于是調用list.contains()的代碼,可是返回的值一直為false,我的list內明明包含該object,卻仍然返回false。后來,自己在網上查了資料,發(fā)現問題是由于list.contains()的源碼是通過object的地址判斷的,所以object的內容一樣,但是地址不一樣,也會返回false。現在把網上的資料整理一下,避免以后仍需查找。


使用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方法來判斷是否包含某一元素,繼續(xù)查看Object類中的equals方法,源碼如下:

??? public boolean equals(Object o) {
??????? return this == o;
??? }



所以,使用“==”比較對象的地址,如果是同一對象即地址相同的情況下,才會返回true,而對于對象屬性值相同但地址不同的不同對象,始終返回false!

如果需要依據對象屬性值是否相同來判斷ArrayList是否包含某一對象,則需要重寫Object的equals方法,并在equals方法中一一比較對象的每個屬性值,如:

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 + "]";
?}
?
}


所以如果需要調用list.caontains(object)的代碼,必須自己重新該object的equals()代碼,編寫自己認為相等的條件,就可以使用了。這次的博客使用到了android 的部分源碼,感覺以前自己很難看懂,但是這次發(fā)行看了后理解起來更容易了。所以大家可以看一些簡單的android 源碼,可以加深對android 的理解。


android list.contains()就這樣講完了。


就這么簡單。










































總結

以上是生活随笔為你收集整理的android list contain的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。