- PR -

配列のサイズ変更について

1
投稿者投稿内容
初芽
会議室デビュー日: 2005/07/03
投稿数: 15
投稿日時: 2005-07-05 09:19
Java初心者で初歩的な質問なのだとおもいますが、よろしくお願いいたします。
1配列を使うときに、初めは[5]でよかったが、後から追加したいという場合、
 どのような方法があるのでしょうか。
2配列もnewしているので、配列クラスがあるのでしょうか。
 API仕様で配列クラスをどのように探したらよいか、教えてください。
よろしくお願いいたします。
hiro
常連さん
会議室デビュー日: 2005/03/10
投稿数: 32
投稿日時: 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があります。
キリウム
会議室デビュー日: 2003/07/04
投稿数: 11
投稿日時: 2005-07-05 10:03
とても丁寧に配列を解説してるHPがありますよ。
hiroさんが紹介しておられるarraycopyについても解説してあります。

http://www.javaroad.jp/java_array1.htm
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-07-05 10:12
引用:

初芽さんの書き込み (2005-07-05 09:19) より:

1配列を使うときに、初めは[5]でよかったが、後から追加したいという場合、
 どのような方法があるのでしょうか。



いくつか考えられます。

(1) 例えば要素数が最初は 5 だったのに後から 10 必要になったという場合、以下のようにします。

コード:

int[] array1 = new int[5]; // この段階では 5 で充分だった
...
// 10 必要になった時
int[] array2 = new int[10];
System.arraycopy(array1, 0, array2, 0, 5); // array1 の内容を array2 にコピー
array1 = array2;



(2) 後から自由に要素数上限が変更できるような方法は、配列を使う限り不可能です。
この場合は配列ではなく java.util.Vector や java.util.ArrayList を使う方が良いでしょう。

引用:

2配列もnewしているので、配列クラスがあるのでしょうか。
 API仕様で配列クラスをどのように探したらよいか、教えてください。
よろしくお願いいたします。



はい。確かに 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/03
投稿数: 15
投稿日時: 2005-07-05 10:14
arraycopyを知ることができ、問題解決できました。
hiroさん、キリウムさんどうもありがとうございましたm(__)m
初芽
会議室デビュー日: 2005/07/03
投稿数: 15
投稿日時: 2005-07-05 10:20
Gioさん、書き込みありがとうございます。
―――――――――――――――――――――――――――――――――――――――
はい。確かに Java の配列はクラスの一つです。
このことは API ドキュメントではなく、Java の言語仕様として決められています。
(何か「トリビアの泉」みたい:-)
―――――――――――――――――――――――――――――――――――――――
仕様として決められているものとして、基本型などもそうなのでしょうか?
intとIntegerがあり、intはIntegerクラス?とも思っていたのですが、
調べれば調べるほど、違うと思っているのですが
基本型も仕様として決められているものなのでしょうか?
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-07-05 10:53
引用:

初芽さんの書き込み (2005-07-05 10:20) より:

仕様として決められているものとして、基本型などもそうなのでしょうか?
intとIntegerがあり、intはIntegerクラス?とも思っていたのですが、
調べれば調べるほど、違うと思っているのですが
基本型も仕様として決められているものなのでしょうか?



int 等の基本型は仕様として決まっています。(4.2 節 Primitive Types and Values)

Integer や Double 等、基本型と一対一に対応するクラス群がありますが、これはクラス API に(以下 java.lang.Integer クラスの説明より引用)
引用:

The Integer class wraps a value of the primitive type int in an object. An object of type Integer contains a single field whose type is int.


とあるように、基本型に対するラッパクラスです。

例えば人の名前に年齢を対応付けて管理するような場合、単純に考えると String から int へのハッシュ表を作れば良いのですが、java.util.HashMap を使おうとすると、このクラスはキー(名前)も値(年齢)も参照型である必要があり、値として int が使えません。
このような場合、Integer クラスでラップするという方法を良く使います。

ちなみに、J2SE 5.0 からは、このラップ/アンラップをプログラム中で明記せず、必要な場合はコンパイラが自動で処理してくれるようになりました。
キーワード「Java autoboxing」で検索してみてください。
初芽
会議室デビュー日: 2005/07/03
投稿数: 15
投稿日時: 2005-07-05 11:06
Gioさんありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)