Javaの早い段階で行う設計上の決定がありました。
配列はプリミティブですか?またはそれらはオブジェクトですか?
答えは、どちらでもない...または別の見方をすれば両方です。それらはシステム自体とjvmのバックエンドとかなり密接に連携します。
この1つの例は、任意のタイプの配列を取る必要のあるjava.lang.System.arraycopy()メソッドです。したがって、配列は何かを継承できる必要があり、それはオブジェクトです。また、arraycopyはネイティブメソッドです。
彼らは(プリミティブを保持できるという点で、配列はおかしいでもあるint
、char
、double
他のコレクションはオブジェクトのみを保持することができますが。見て、例えば、で...、などjava.util.Arraysや方法に等しいの醜い。これは、中に入れました。後の考えとして、 deepEquals(Object []、Object [])は1.5まで追加されませんでしたが、残りのArraysクラスは1.2で追加されました。
これらのオブジェクトは配列であるため、メモリレベルまたはメモリレベルに近いいくつかのことを実行できます。Javaは多くの場合、コーダーから隠しているものです。これにより、オブジェクトモデルをほとんど壊すことを犠牲にして、特定の処理をより高速に実行できます。
システムの早い段階で、柔軟性とパフォーマンスの間でトレードオフがありました。パフォーマンスは勝ち、柔軟性の欠如はさまざまなコレクションに含まれていました。Javaの配列は、必要なときにシステムを操作することを目的としたプリミティブ型の上に(当初は)薄く実装されたオブジェクトです。
ほとんどの場合、生の配列は、元の設計者が無視してシステムのみに隠そうとしたものでした。そして、彼らはそれが高速であることを望んでいました(初期のJavaは速度にいくつかの問題がありました)。配列がいい配列ではないことは設計上いぼでしたが、システムにできるだけ近いものを公開したいときに必要でした。さらに言えば、初期のJavaの現代の言語にもこのいぼがあり.equals()
、C ++の配列に対しては実行できません。
JavaとC ++はどちらも配列に対して同じパスをとりました-配列ではなく配列に対して必要に応じて操作を実行する外部ライブラリ...そして、彼らが本当に何をしているのか、なぜそうなのかを理解していない限り、より良いネイティブ型を使用するようにコーダーに提案しますそのようにしています。
したがって、配列に.equalsを埋め込む方法は間違っていますが、C ++からのコーダーが知っていたのと同じ問題です。したがって、パフォーマンスの点で最も間違いのないものを選択しました-オブジェクトの実装のままにしておきます。2つのオブジェクトは、それらが同じオブジェクトを参照している場合にのみ等しくなります。
ネイティブバインディングと通信できるようにするには、配列をプリミティブのような構造にする必要があります。これは、従来のC配列に可能な限り近いものです。ただし、他のプリミティブとは異なり、参照として、したがってオブジェクトとして渡すことができる配列が必要です。つまり、いくつかのオブジェクトハックと境界チェックを備えたプリミティブです。