- - PR -
配列のサイズ変更について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-07-05 09:19
Java初心者で初歩的な質問なのだとおもいますが、よろしくお願いいたします。
1配列を使うときに、初めは[5]でよかったが、後から追加したいという場合、 どのような方法があるのでしょうか。 2配列もnewしているので、配列クラスがあるのでしょうか。 API仕様で配列クラスをどのように探したらよいか、教えてください。 よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2005-07-05 09:53
新しい配列を用意して、System.arraycopyを使って配列全体をコピーする方法があります。 String[] str = new String[] {"test", "test1","test2","test3","test4"}; String[] foo = new String[6]; System.arraycopy(str,0,foo, 0, str.length); foo[5] = "test5"; 配列はAPI ドキュメントには載っていないと思います(うそを書いていましたらすみません) Javaでは、参照を扱うためにはオブジェクトで扱うことになっています。 配列を使うときは new して領域を確保しています。 また、Objectクラスを継承を暗黙的に継承しています。 しかし、Objectクラスのメソッドを利用することはできません(一部利用できるメソッドがあります) また、配列用のプロパティとしてlengthがあります。 | ||||||||||||
|
投稿日時: 2005-07-05 10:03
とても丁寧に配列を解説してるHPがありますよ。
hiroさんが紹介しておられるarraycopyについても解説してあります。 http://www.javaroad.jp/java_array1.htm | ||||||||||||
|
投稿日時: 2005-07-05 10:12
いくつか考えられます。 (1) 例えば要素数が最初は 5 だったのに後から 10 必要になったという場合、以下のようにします。
(2) 後から自由に要素数上限が変更できるような方法は、配列を使う限り不可能です。 この場合は配列ではなく java.util.Vector や java.util.ArrayList を使う方が良いでしょう。
はい。確かに Java の配列はクラスの一つです。 このことは API ドキュメントではなく、Java の言語仕様として決められています。 (何か「トリビアの泉」みたい:-) 書籍版とは細かな点で異なると断っていますが、ネット上でも読めるので URL を紹介しておきます。配列型のクラスとしての挙動は 10.7 節と 10.8 節で解説されています。 The Java Language Specification, Third Edition http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html 利用ライセンスが以下に明記されていますので、こちらもご熟読ください。 http://java.sun.com/docs/books/jls/ # 日本語版もピアソンエデュケーションより出版されていますが、こちらは第 2 版で若干古いです。 [ メッセージ編集済み 編集者: Gio 編集日時 2005-07-05 10:13 ] | ||||||||||||
|
投稿日時: 2005-07-05 10:14
arraycopyを知ることができ、問題解決できました。
hiroさん、キリウムさんどうもありがとうございましたm(__)m | ||||||||||||
|
投稿日時: 2005-07-05 10:20
Gioさん、書き込みありがとうございます。
――――――――――――――――――――――――――――――――――――――― はい。確かに Java の配列はクラスの一つです。 このことは API ドキュメントではなく、Java の言語仕様として決められています。 (何か「トリビアの泉」みたい:-) ――――――――――――――――――――――――――――――――――――――― 仕様として決められているものとして、基本型などもそうなのでしょうか? intとIntegerがあり、intはIntegerクラス?とも思っていたのですが、 調べれば調べるほど、違うと思っているのですが 基本型も仕様として決められているものなのでしょうか? | ||||||||||||
|
投稿日時: 2005-07-05 10:53
int 等の基本型は仕様として決まっています。(4.2 節 Primitive Types and Values) Integer や Double 等、基本型と一対一に対応するクラス群がありますが、これはクラス API に(以下 java.lang.Integer クラスの説明より引用)
とあるように、基本型に対するラッパクラスです。 例えば人の名前に年齢を対応付けて管理するような場合、単純に考えると String から int へのハッシュ表を作れば良いのですが、java.util.HashMap を使おうとすると、このクラスはキー(名前)も値(年齢)も参照型である必要があり、値として int が使えません。 このような場合、Integer クラスでラップするという方法を良く使います。 ちなみに、J2SE 5.0 からは、このラップ/アンラップをプログラム中で明記せず、必要な場合はコンパイラが自動で処理してくれるようになりました。 キーワード「Java autoboxing」で検索してみてください。 | ||||||||||||
|
投稿日時: 2005-07-05 11:06
Gioさんありがとうございました。
|
1