質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    14126questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

多次元配列のforeach文の動きについて

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 807

sobue

score 166

public class Arrayx3 {

    public static void main(String[] args) {

        //3次元配列の宣言
        int a3[][][] = new int[3][3][3];

        for(int i = 0;i < 3;i++){
            for(int j = 0;j < 3;j++){
                for(int k = 0;k < 3;k++){
                    a3[i][j][k] = i * 9 + j * 3 + k;
                }
            }
        }

        for(int [][] e1 : a3){
            for(int [] e2 : e1){
                for(int e3 : e2){
                    System.out.printf(e3 + " ");
                    System.out.printf("  ");
                }
                System.out.println();
            }
        }
    }

}


上記のコードを実行すると
0   1   2   
3   4   5   
6   7   8   
9   10   11   
12   13   14   
15   16   17   
18   19   20   
21   22   23   
24   25   26   
と出ますが
        for(int [][] e1 : a3){
            for(int [] e2 : e1){
                    System.out.printf(e2 + " ");
                    System.out.printf("  ");
                System.out.println();
            }
        }
    }
と変更すると
[I@14ae5a5   
[I@7f31245a   
[I@6d6f6e28   
[I@135fbaa4   
[I@45ee12a7   
[I@330bedb4   
[I@2503dbd3   
[I@4b67cf4d   
[I@7ea987ac   
と出ます。
この出力が何を表しているのでしょうか?
メモリの位置なのかな?とも思いましたが・・・・
デバッグをしても綺麗な数字しか表示されないので
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

配列オブジェクトをそのままprintした場合、このような文字列が出力される仕様になっています。
[Iの部分がint配列という意味を、@の後ろがそのオブジェクトのハッシュ・コードを表しています。

...

java.util.ArraysクラスのtoStringメソッドを使うと、配列の内容を文字列にしてくれます。

  • 使用例
// import java.util.Arrays;
System.out.println(Arrays.toString(e2));


java.util.Arraysクラス toStringメソッド - Java SE 8 API ドキュメント
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html#toString-int:A-

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 09:05

    わかったような…わからないような…。まだ、この動きを知るのには早かったようです。もっと勉強してから再度この回答を見直してみます。ありがとうございます。

    キャンセル

checkベストアンサー

0

System.outはPrintStreamオブジェクトであり、このクラスのprint,printlnメソッドは、様々なオーバーロードがあります。プリミティブ値各種とchar配列、String、そしてObjectを受け取り、対応する文字列を出力します。Object(char配列、Stringを除く参照型すべて)を受け取った場合、そのObjectがnullでないかぎり、Object.toString()を呼び出した結果を出力します。char以外の配列も参照型なので、Objectに該当します。
通常、このtoString()メソッドは各種クラスでオーバーライドされ、そのオブジェクトを端的に表す文字列を返すよう設計されるのですが、配列はそうはなっていません。そのため、デフォルトのクラス名@ハッシュコードという形の文字列を返します。配列の場合、クラス名が特殊な形で表されます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 09:04

    わかったような…わからないような…。まだ、この動きを知るのには早かったようです。もっと勉強してから再度この回答を見直してみます。ありがとうございます。

    キャンセル

0

配列を文字列化しているだけです。

foreachの動きは同じ動きをする通常for文を作ればわかりやすいかも
もともとのコードを直すと次のようになります(一部省略してあります。以下同)

for (int i = 0; i < 3; i++) {
    int[][] e1 = a3[i];
    for (int j = 0; j < 3; j++) {
        int[] e2 = e1[j];
        for (int k = 0; k < 3; k++) {
            int e3 = e2[k];
            System.out.println(e3);
        }
    }
}


で、質問に書かれているコードの方は

for (int i = 0; i < 3; i++) {
    int[][] e1 = a3[i];
    for (int j = 0; j < 3; j++) {
        int[] e2 = e1[j];
        System.out.println(e2);
    }
}


となり、つまり、最初の[I@14ae5a5の部分は

int[] e2=a3[0][0];
System.out.println(e2);


です。
[]の数が混乱するかもしれませんね。
(それを防ぐためでもあるforeach)

現在は通常の配列をprintlnしているだけです。

基本的に配列もオブジェクトです。

ということで
java.lang.ObjectのtoString()が採用されます。
で、java.lang.ObjectのtoStringのドキュメントは

オブジェクトの文字列表現を返します。一般に、toStringメソッドは、このオブジェクトを「テキストで表す」文字列を返します。この結果は、人間が読める簡潔で有益な情報であるべきです。すべてのサブクラスで、このメソッドをオーバーライドすることをお薦めします。
クラスObjectのtoStringメソッドは、オブジェクトがインスタンスになっている元のクラスの名前、アットマーク文字「@」、およびオブジェクトのハッシュ・コードの符号なし16進数表現から構成される文字列を返します。つまり、このメソッドは次の値と等しい文字列を返します。

 getClass().getName() + '@' + Integer.toHexString(hashCode())

ソース元(https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#toString--)

以下を実行してみてください。

public class TruthOfArray {

    public static void main(String[] args) {
    int[] a = new int[3];
    System.out.println(a.getClass());
    System.out.println(Integer.toHexString(a.hashCode()));

    System.out.println(a);

    if (a instanceof Object) {
        System.out.println("配列はオブジェクトだった");
    } else {
        System.out.println("配列はオブジェクトじゃない");
    }
    }

}


つまり、配列はオブジェクトで、
クラス名は、「[I」、
オブジェクトのtoStringは「クラス名+@+ハッシュ
よって、配列のtoStringは「[I+@+ハッシュ

実験のためにもe1,e2,e3をSystem.out.printlnしてみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

変数e2はどのような型?そしてこれをprintfメソッドの引数とすると?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/19 22:50

    e2は1次元配列ですが?引数に渡すと・・・・?String型で待っているから型がおかしいってことですか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 解決済

    Javaで文字コードの変換をしたい

    前提・実現したいこと 今Javaで文字コードの扱いについて勉強しています。 発生している問題・エラーメッセージ 一度UTF-8からShift_JISに変換したあともう一度

  • 解決済

    100になる直前の加算結果出力

    javaで開始値と終了値を入力してその間の偶数を加算していき、合計が100を超えたら「数値が100を超えたため、処理を中止します。」とメッセージを出し、かつ合計が100になる前の加

  • 解決済

    javaで九九の表を作成する

    お知恵をお貸しください。 現在javaで九九の表を作成しようとしています。 検索すれば一発で出るのですが、今回作成しなければいけない表の形式が少々厄介な代物です。 以下の

  • 解決済

    javaについて

    javaについて質問です。情報処理検定第53回のプログラミング部門1級のjavaの問題をやっているんですけど、そのjavaに平均値を追加したいです。どのように追加すれば良いのでしょ

  • 解決済

    改行区切りでの出力

    ランダムな整数を改行区切りで3個出力したくて以下のコードを打ってみたんですが間違いといわれました。どこが違うのか指摘お願いします  public class Main {  p

  • 解決済

    偶数だけ出したい

    public class Main { public static void main(String[] args) throws Exception { for (int

  • 解決済

    Javaのオーバーライドについての質問です。

    学校の課題をしているのですが、以下のような実行結果になりません。まだ今日オーバーライドを習ったばっかりでよくわからないんですがご指摘お願いします。初心者で説明不足かもしれませんがよ

同じタグがついた質問を見る

  • Java

    14126questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。