JavaRush /Java Blog /Random-TW /喝咖啡休息#176。Array 和 ArrayList 之間的異同。如何寫有效的 equals() 方法

喝咖啡休息#176。Array 和 ArrayList 之間的異同。如何寫有效的 equals() 方法

在 Random-TW 群組發布

Array 和 ArrayList 的異同

資料來源: Medium 本文重點了解 Array 和 ArrayList 的概念以及它們之間的差異。 喝咖啡休息#176。 Array 和 ArrayList 之間的異同。 如何寫出高效率的 equals() 方法 - 1

Java數組

數組是一種資料結構,可讓您儲存相同類型的值的有序序列。例如,您可以建立字元、數字等的陣列。這適用於所有原始類型,甚至像String這樣的物件。數組一旦創建,我們就無法更改其大小。以下是聲明數組引用變數並分配數組的一般範例:
dataType[] arrayName = new dataType[numElements];
如果我們嘗試新增超過陣列大小的內容,我們會得到ArrayIndexOutOfBoundsException

數組聲明

若要聲明數組,請在資料類型後使用[ ]字元。它們表明該變數是對數組的引用。數組引用變數可以引用各種大小的數組。new關鍵字在記憶體中建立空間來儲存具有指定數量元素的陣列。分配一個數組引用變數來引用這個新分配的數組。以下範例宣告一個陣列引用變數gameScores,分配一個包含四個整數的陣列,並指派gameScores來引用指派的陣列。
int[] gameScores = new int[4];
當使用new關鍵字初始化陣列參考時,陣列元素會自動初始化為預設值。整數和浮點資料型態元素的預設值為零,布林元素的預設值為false。您也可以宣告一個數組引用變數而不立即分配該數組,然後用分配的數組分配該變數。
int[] gameScores;

gameScores = new int[4];

使用非預設值初始化數組

您可以透過在用逗號分隔的大括號{}中指定初始值來用非預設值初始化陣列元素。
int [] myArray = { 5 , 7 , 11 };
上面的範例建立了一個由三個整數元素組成的數組,其值為 5、7 和 11。此數組初始化不需要使用new 關鍵字,因為數組大小會自動設定為大括號中的元素數量。對於大型數組,可以透過先定義數組,然後使用循環分配數組元素來完成初始化。可以使用從零開始的索引來存取陣列元素。
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

數組列表

ArrayList是可調整大小的參考類型的元素的有序列表。它也是屬於 Java Collection Framework 的java.util套件中的一個類別。ArrayList為我們提供了動態陣列並自動處理調整它們的大小。當您為 ArrayList 新增元素時,記憶體大小會自動增加。您可以使用import java.util.ArrayList;來使用ArrayList 。我們也可以使用以下語句 建立一個ArrayList實例:
ArrayList<Type> arrayList = new ArrayList<Type>();
ArrayList 的 大小可以成長以容納它所需的元素。ArrayList不支援原始型別(例如int ),而是支援參考型別(例如Integer )。初學者中的一個常見錯誤是聲明基本類型(例如int )的ArrayList,如ArrayList<int> myVals。這會導致編譯錯誤:「意外類型,找到:int,必需:引用」。範例:讓我們建立一個名為cars的ArrayList對象,它將儲存字串:
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
若要將元素新增至ArrayList ,請使用add()方法。要存取ArrayList的元素,請使用get()方法。
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
Java 中內建陣列和ArrayList之間的差異在於,在第一種情況下,陣列的大小無法變更(如果要新增或從陣列中刪除元素,則需要建立新陣列) )。而在ArrayList中,可以隨時新增和刪除元素。

Array 和 ArrayList 之間的相似之處

  • ArrayArrayList用於儲存元素。
  • ArrayArrayList可以儲存空值。
  • 這兩個過程都在恆定時間內發生。
  • 它們可能有重複的值。
  • ArrayArrayList不保證有序元素的存在。

Array 和 ArrayList 之間的主要區別

陣列 ( Array ) 和ArrayList之間的主要差異在於陣列的靜態性質和ArrayList 的動態性質。一旦創建,您就無法更改數組的大小,而ArrayList可以根據需要更改其大小。另一個重要的區別是數組是 Java 提供的基本功能。另一方面,ArrayList是Java中集合框架的一部分。我們可以使用方括號存取數組的元素,在方括號中我們可以指定索引。雖然有一組方法可以存取ArrayList 的元素並更改它們。儘管兩者有所不同,但在其他方面仍然具有可比性。Java 中的這兩種資料結構都基於索引並允許您儲存物件。此外,它們允許空值和重複項。如果您事先知道物件的大小,那麼最好使用陣列。但如果你不確定大小,那麼你應該使用ArrayList

如何寫有效的 equals() 方法

來源:Medium 這篇文章將幫助您更能理解使用 Java 程式碼時equals()方法的使用。 如果我們談論預設的equals()方法並且沒有任何實現,那麼它在很多方面類似於==操作。也就是說,該方法比較物件。例如,equals()比較兩個字串,如果字串相等則傳回true,否則傳回false 。請注意,不建議使用==運算子來比較 Java 中的物件。原因是在比較物件時,只有當引用指向同一個物件時,==才會回傳true 。避免問題的最簡單方法是不重寫equals方法,在這種情況下,類別的每個實例僅等於其自身。只有當類別具有與物件的簡單標識不同的邏輯相等概念,且超類別尚未重寫相等性時,才需要重寫equals。因此,使用equals()方法時,需要判斷物件參考在邏輯上是否等價,是否引用同一個物件。

equals 方法的屬性

每個equals方法都實現一個等價關係。它具有以下屬性:
  • 自反:對於任何非空引用值x, x.equals (x)必須傳回true

  • 對稱:對於任何非空參考值xy只有當y.equals(x)傳回true時, x.equals(y)才必須傳回true

  • 傳遞性:對於任何非空引用值x y z,如果x.equals(y)傳回truey.equals(z)回傳true,則x.equals(z)也必須傳回true

  • 一致:對於任何非空引用值xy,多次呼叫x.equals(y)必須一致傳回true或一致回傳false

  • 非空:對於任何非空引用值x, x.equals (null)必須傳回false

讓我們仔細看看每個屬性:

自反性:

一個物件必須等於它自己。若要驗證這一點,請將類別的實例新增至集合中。contains方法很可能表示該集合不包含您剛剛新增的實例。

對稱:

兩個物件(它們可以來自不同的類別)必須彼此相等。

後續:

不要寫依賴不可靠/易失資源的 equals方法。

非零:

如果傳遞給equals 的物件為null ,則始終傳回true

我們總結一下:

這是品質等於方法的秘訣:
  1. 使用==運算子來測試參數是否為對此物件的參考。

  2. 使用instanceof運算子檢查參數的類型是否正確。

  3. 將參數轉換為正確的類型。

  4. 對於類別中的每個「重要」字段,檢查該參數字段是否與該物件的相應字段相符:

    • 對於原始欄位:其類型不是floatdouble,請使用==運算子進行比較。
    • 對於物件參考欄位:遞歸呼叫equals方法;對於浮點字段,使用靜態方法Float.compare(float, float); 對於雙字段,請使用Double.compare(double, double)
    • 對於陣列欄位:將這些準則套用至每個元素。如果陣列欄位中的每個元素都很重要,請使用Arrays.equals()方法之一。
    • 某些物件引用欄位可能包含空值。為了避免拋出NullPointerException,請使用靜態方法Objects.equals(Object, Object)檢查這些欄位是否相等。
  5. 當你寫完equals方法後,問自己三個問題:它是對稱的嗎?它是傳遞性的嗎?他是否始終如一?

請記住,在覆蓋equals時始終覆蓋hashCode
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION