Java List比較詳解

一)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;
    }
}

控制檯打印效果圖爲:

 

識別二維碼關注個人微信公衆號

本章完結,待續,歡迎轉載!
 
本文說明:該文章屬於原創,如需轉載,請標明文章轉載來源!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章