私は最近、面接官がArrays
とArrayList
に関する質問をするインタビューに出演しました。
彼は、配列の配列が多次元になれるかどうかを尋ねましたが、なぜArrayList
のArrayList
は多次元ではないのですか?
例えば:
// Multidimensional
int[][] array = new int[m][n];
// Not multidimensional
ArrayList<ArrayList<Integer>> seq = new ArrayList<ArrayList<Integer>>();
誰も私がこれを理解するのを助けることができますか?
Cay S. Horstmannは彼の本の中で述べているCore Javaせっかちな人のために:
Javaには2次元の配列リストはありませんが、
ArrayList<ArrayList<Integer>>
型の変数を宣言して、自分で行を作成できます。
ArrayList
sが伸縮して多次元ではなくギザギザになる可能性があるため、それはではなく 2次元配列、多次元の意味固定行と列、したがって、コメント内でJavaにはtrue多次元配列はありませんが、これはあなたの質問の範囲外です。
Javaにはtrueがない多次元配列には読み取りがあります 多次元配列と配列の違いC#の配列の数
Javaにtrue多次元配列があるかどうかに関する答えを明確にするために、私はnot say Java does 「多次元配列はありません。Javaはtrue多次元配列を持たず、期待どおり [〜#〜] jls [〜# 〜] の記載:
多次元配列は、各レベルで同じ長さの配列を持つ必要はありません。
同じ理由で、私がすべての予備の買い物袋を入れた買い物袋は多次元の買い物袋ではありません。
ある袋にナットを入れて、その袋を別の袋に入れると、ナットを得るために2つの操作を実行する必要があります。
代わりに、ナットを2次元のコンポーネントトレイに入れると、1つの操作を実行して、2つのインデックスを使用してアクセスできます。
同様に、リストのリスト(または配列の配列)と真の2次元配列には基本的な違いがあります。2次元配列の要素にアクセスするには、2つのインデックスを取る単一の操作が使用されます。リストのリスト内の要素にアクセスするために使用されます。
ArrayListには単一のインデックスがあるため、ランクは1です。2次元配列には2つのインデックスがあり、ランクは2です。
注:「2次元配列」とは、Java配列の配列(参照))ではなく、FORTRANなどの他の言語で見られる2次元配列を指します。Javaには多次元配列がありません。インタビュアーが特にJava 'arrays of array'について言及している場合、Javaのint[][]
は、整数の配列への参照の配列を定義します。これには、要素にアクセスするために2つの逆参照操作が必要です。たとえば、Cの配列の配列は、単一の間接参照操作によるアクセスをサポートしているため、多次元の場合により近くなります。
反対側から見ると、「多次元」配列とまったく同じ方法でリストを使用できます。 _array[row][column]
_をsomeList.get(row).get(column)
に置き換えるだけです!
そして最後に、Java配列は同様の方法で実装されます:2次元行列は1次元配列の1次元配列でもあります!言い換えれば、違いは表面上にあり、深い概念的な理由に根ざしていない!
正確に言うと、Java型システムは_Object[][]
_を置くことができるので、その意味で、その型は_Object[][]
_;の型を知っていますが、現実には、多次元配列はありません; Javaは、その「2つの薄暗い」ものを配列への参照の配列として見ます!
一方、「 JVM specification 」が明示的に言及しているように、「多次元配列」のある概念があります。
Multianewarray命令の第1オペランドは、作成される配列クラス型への実行時定数プールインデックスです。 2番目は、実際に作成するその配列型の次元数です。 create3DArrayのコードが示すように、multianewarray命令を使用して、型のすべての次元を作成できます。多次元配列は単なるオブジェクトであるため、aload_1命令とareturn命令によってそれぞれロードおよび返されることに注意してください。
インタビュアーの主張は無意味です。
このページでわかるように、Javaには真の多次元配列がありません。この場合、多次元ArrayListもありません。一方、確かに、同じ方法で配列とArrayListを介して多次元構造を表します。
2つの主要な区別を定義することは、かなりarbitrary意的で無意味です。
おそらく、インタビュアーは、詳細を説明する能力をテストするために、技術的な議論を始めようとしていただけかもしれません。
私はここで手足に出てこれに答えますが、この広範な質問には正しい答えはありません。
まず、配列を多次元にするのは何ですか?
あなたのインタビュアーは、「あなたが質問で示したように」固定サイズの多次元配列を考慮し、「ギザギザ」とはみなされないと仮定します。 Microsoftによると、C#の jagged 配列は次のとおりです。
ギザギザの配列の要素は、異なる次元とサイズにすることができます。
Javaでは、多次元配列は単純な配列であり、各要素も配列です。これらの配列は、要素内でインデックスを作成するために固定サイズで定義する必要がありますが、前述のように、ギザギザの配列は異なるサイズにすることができます。
ArrayList
は配列によって支えられています。ただし、特定の数の要素が追加されると、配列は拡張されます。このため、ArrayList
はギザギザになり、多次元ではなくなったと見なされる可能性があります。
編集:数回にわたってすべてを読み直した後、あなたのインタビュアーがあなたを混乱させようとしているに違いないと思います。正直なところ、あるデータ型(配列)が多次元であり、別のデータ型(配列を使用するArrayList
)が多次元でないことは意味がありません。
ArrayList
は、 List の実装です。配列を使用して実装されるList
です。配列の使用法は実装の詳細です。 list interface は多次元リストの概念をサポートしていないため、ArrayList
も期待していません。さらに、 従来のリストデータ構造 のユースケースとして扱われていません。
配列はJavaの言語機能であるため、多次元をサポートします。
それはまったく次元ではないからです。 APIを備えたオブジェクトです。多次元の外観はAPIによって提供されますが、それは純粋に見る人の目です。 array一方、is次元であり、したがって多次元にもなります。