一)List基本類型比較
測試方式:聲明兩個List,分別往List中添加元素,只不過元素的順序不一致,直接調用List的equals方法,查看返回結果。
package com.oysept.list;
import java.util.ArrayList;
import java.util.List;
public class ListCompare {
public static void main(String[] args) {
// 基本類型
List<Object> list1 = new ArrayList<Object>();
list1.add(111);
list1.add("aaa");
list1.add("bbb");
list1.add("ccc");
List<Object> list2 = new ArrayList<Object>();
list2.add("aaa");
list2.add("bbb");
list2.add("ccc");
list2.add(111);
System.out.println("list1和list2中元素比較結果爲: " + list1.equals(list2));
}
}
打印效果圖:預期結果應該返回true,結果返回false
查看一下List中equals源碼,List繼承了java.util.AbstractList抽象類,該類實現了equals方法,源碼如下:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator<E> e1 = listIterator();
ListIterator<?> e2 = ((List<?>) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
從源碼可以看出,List對象在equals時,是一行一行循環比較,又因爲List底層是通過數組的方式實現,所以想得到預期的結果,必須保證兩個List的元素size和順序一致,纔會返回true。
但在實際項目中,不可能一致保持兩個List元素順序一致,所以編寫了一個通用一點的List equals方法。
/**
* 比較兩個List的元素值是否全部一致
* @param t1
* @param t2
* @return
*/
public static <T> boolean listEquals(List<T> t1, List<T> t2) {
if ((t1 == null && t2 == null) || t1 == t2) { // 爲空or引用地址一致時
return true;
} else if (t1.size() != t2.size()) { // 數量一致, 過濾掉了list1中有{1,1,3},list2中有{1,3,4}的場景
return false;
}
for (T t : t1) {
if (!t2.contains(t)) { // equals比較
return false;
}
}
return true;
}
二)List對象類型比較
先創建一個Book的對象類,並重寫equals和toString方法
重寫equals的原因:當不重寫equals方法時,比較的是兩個對象存儲的內存地址,對象不同內存地址肯定不一致,所以需要重寫equals方法,具體判斷對象的屬性是否一致
package com.oysept.list;
public class Book {
private String title;
private Integer number;
public Book() {}
public Book(String title, Integer number) {
this.title = title;
this.number = number;
}
public String getTitle() {return title;}
public void setTitle(String title) {this.title = title;}
public Integer getNumber() {return number;}
public void setNumber(Integer number) {this.number = number;}
@Override
public String toString() {
return "[title=" + title + ", number=" + number + "]";
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Book)) {
return false;
}
Book book = (Book) o;
if (this.title.equals(book.getTitle())
&& this.number.equals(book.getNumber())) { // 由於number是Integer類型, 所以需要用equals比較
return true;
}
return false;
}
}
測試源碼:
package com.oysept.list;
import java.util.ArrayList;
import java.util.List;
public class ListCompare {
public static void main(String[] args) {
// 對象類型, List元素順序不一致
List<Book> list5 = new ArrayList<Book>();
list5.add(new Book("BBB", 222));
list5.add(new Book("CCC", 111));
list5.add(new Book("AAA", 333));
List<Book> list6 = new ArrayList<Book>();
list6.add(new Book("AAA", 333));
list6.add(new Book("BBB", 222));
list6.add(new Book("CCC", 111));
System.out.println("兩個List比較結果爲: " + listEquals(list5, list6));
}
/**
* 比較兩個List的元素值是否全部一致
* @param t1
* @param t2
* @return
*/
public static <T> boolean listEquals(List<T> t1, List<T> t2) {
if ((t1 == null && t2 == null) || t1 == t2) { // 爲空or引用地址一致時
return true;
} else if (t1.size() != t2.size()) { // 數量一致, 過濾掉了list1中有{1,1,3},list2中有{1,3,4}的場景
return false;
}
for (T t : t1) {
if (!t2.contains(t)) { // equals比較
return false;
}
}
return true;
}
}
控制檯打印效果圖爲:
識別二維碼關注個人微信公衆號
本章完結,待續,歡迎轉載!
本文說明:該文章屬於原創,如需轉載,請標明文章轉載來源!