JavaRush /Java Blog /Random-JA /コーヒーブレイク #176。Array と ArrayList の類似点と相違点。効果的なequals()メソッド...

コーヒーブレイク #176。Array と ArrayList の類似点と相違点。効果的なequals()メソッドの書き方

Random-JA グループに公開済み

Array と ArrayList の類似点と相違点

出典: Medium この記事は、Array と ArrayList の概念とそれらの違いを理解することに重点を置いています。 コーヒーブレイク #176。 Array と ArrayList の類似点と相違点。 効率的なequals()メソッドの書き方 - 1

Java配列

配列は、同じ型の値の順序付けされたシーケンスを保存できるデータ構造です。たとえば、文字や数値などの配列を作成できます。これは、すべてのプリミティブ型だけでなく、 Stringなどのオブジェクトにも適用されます。配列が作成されると、そのサイズを変更することはできません。配列参照変数を宣言して配列を割り当てる一般的な例を次に示します。
dataType[] arrayName = new dataType[numElements];
配列のサイズを超えるものを追加しようとすると、ArrayIndexOutOfBoundsExceptionが発生します。

配列宣言

配列を宣言するには、データ型の後に[ ]文字を使用します。これらは、変数が配列への参照であることを示します。配列参照変数は、さまざまなサイズの配列を参照できます。newキーワードは、指定された数の要素を含む配列を格納するためのスペースをメモリ内に作成します。この新しく割り当てられた配列を参照するために、配列参照変数が割り当てられます。次の例では、配列参照変数gameScoresを宣言し、4 つの整数の配列を割り当て、割り当てられた配列を参照するよう gameScoresを割り当てます。
int[] gameScores = new int[4];
new キーワードを使用して配列参照を初期化すると、配列要素は自動的にデフォルト値に初期化されます。整数および浮動小数点データ型の要素のデフォルト値は 0 で、ブール要素のデフォルト値はfalseです。配列をすぐに割り当てずに配列参照変数を宣言し、割り当てられた配列を変数に割り当てることもできます。
int[] gameScores;

gameScores = new int[4];

デフォルト以外の値を使用した配列の初期化

中括弧{}内にカンマで区切って初期値を指定することで、配列要素をデフォルト以外の値で初期化できます。
int [] myArray = { 5 , 7 , 11 };
上の例では、値 5、7、および 11 を持つ 3 つの整数要素の配列を作成します。配列のサイズは、配列内の要素の数に自動的に設定されるため、この配列の初期化では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などの参照型をサポートします。初心者にありがちな間違いは、ArrayList<int> myValsのように、intなどのプリミティブ型のArrayListを宣言することです。これにより、コンパイル エラーが発生します。「予期しない型、見つかりました: 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 はnull 値を格納できます。
  • どちらのプロセスも一定時間内に発生します。
  • 重複した値が含まれる可能性があります。
  • ArrayArrayList は、順序付けされた要素の存在を保証しません。

Array と ArrayList の主な違い

配列 ( Array ) とArrayListの主な違いは、配列の静的な性質とArrayList の動的性質です。作成後に配列のサイズを変更することはできませんが、ArrayList は必要に応じてサイズを変更できます。もう 1 つの重要な違いは、配列が Java によって提供される基本機能であることです。一方、ArrayList はJava のコレクション フレームワークの一部です。インデックスを指定できる角括弧を使用して、配列の要素にアクセスできます。ArrayList の要素にアクセスして変更するための一連のメソッドがあります。たとえそれらが異なっていても、他の点では両方とも比較可能です。Java のこれらのデータ構造はどちらもインデックスに基づいており、オブジェクトを格納できます。さらに、NULL 値と重複も許可されます。オブジェクトのサイズが事前にわかっている場合は、配列を使用することをお勧めします。ただし、サイズがわからない場合は、代わりにArrayListを使用する必要があります。

効果的なequals()メソッドの書き方

出典: Mediumこの投稿は 、Java コードを操作する際の、equals()メソッドの使用法をより深く理解するのに役立ちます。デフォルトのequals()メソッド について何も実装せずに話すと、多くの点で==操作と似ています。つまり、このメソッドはオブジェクトを比較します。たとえば、equals() は2 つの文字列を比較し、文字列が等しい場合はtrueを返し、等しくない場合はfalseを返します。==演算子は Java でのオブジェクトの比較には推奨されないことに注意してください。その理由は、オブジェクトを比較する場合、参照が同じオブジェクトを指している場合にのみ== がtrueを返すからです。問題を回避する最も簡単な方法は、 equalsメソッドをオーバーライドしないことです。この場合、クラスの各インスタンスはそれ自体とのみ等しくなります。クラスにオブジェクトの単純な ID とは異なる論理的等価性の概念があり、スーパークラスがまだ等価性をオーバーライドしていない場合にのみ equals をオーバーライドする必要があります。したがって、equals()メソッドを使用する場合は、オブジェクト参照が論理的に同等であるかどうか、およびそれらが同じオブジェクトを参照しているかどうかを 確認する必要があります。

等号メソッドのプロパティ

各equalsメソッドは等価関係を実装します。次のような特性があります。
  • Reflexive : null 以外の参照値x の場合、 x.equals (x)はtrueを返さなければなりません。

  • 対称: null 以外の参照値xおよびyについては、y.equals(x) がtrue を返す場合にのみ、 x.equals(y) はtrueを返す必要があります。

  • 推移的: null 以外の参照値x y zについて、 x.equals(y)がtrueを返し、 y.equals(z)がtrueを返す場合、 x.equals(z)trueを返す必要があります。

  • Consistent : null 以外の参照値xおよびy については、x.equals(y) を複数回呼び出した場合、一貫してtrueを返すか、一貫してfalseを返す。

  • Non-nullity : null 以外の参照値x の場合、 x.equals (null)はfalseを返さなければなりません。

各プロパティを詳しく見てみましょう。

反射性:

オブジェクトはそれ自体と等しくなければなりません。これを確認するには、クラスのインスタンスをコレクションに追加します。containsメソッドは、追加したばかりのインスタンスがコレクションに含まれていないことを示している可能性があります。

対称:

2 つのオブジェクト (異なるクラスのものでもかまいません) は互いに等しくなければなりません。

後続:

信頼性の低い/揮発性のリソースに依存するequalsメソッドを作成しないでください。

ゼロ以外:

渡されたオブジェクトがnullの場合は、常にtrueを返します。

要約しましょう:

品質同等メソッドのレシピは次のとおりです。
  1. ==演算子を使用して、引数がこのオブジェクトへの参照であるかどうかをテストします。

  2. 引数の型が正しいかどうかを確認するには、instanceof演算子を使用します。

  3. 引数を正しい型にキャストします。

  4. クラス内の「重要な」フィールドごとに、その引数フィールドがそのオブジェクトの対応するフィールドと一致するかどうかを確認します。

    • プリミティブ フィールドの場合:型がfloatまたはdoubleではない場合は、比較に==演算子を使用します。
    • オブジェクト参照フィールドの場合: equals メソッドを再帰的に呼び出します浮動小数点フィールドの場合は、静的メソッドFloat.compare(float, float) を使用します。double フィールドの場合はDouble.compare(double, double)を使用します。
    • 配列フィールドの場合:これらのガイドラインを各要素に適用します。配列フィールド内のすべての要素が重要な場合は、Arrays.equals()メソッドのいずれかを使用します。
    • 一部のオブジェクト参照フィールドにはnull 値が含まれる場合があります。NullPointerException のスローを回避するには、静的メソッドObjects.equals(Object, Object)を使用して、そのようなフィールドが等しいかどうかを確認します。
  5. equalsメソッドを書き終えたら、次の 3 つの質問を自問してください。それは対称ですか? 推移的ですか?彼は一貫性を持っていますか?

また、equalsをオーバーライドするときは、常にhashCodeをオーバーライドすることを覚えておいてください。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION