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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

2回答

712閲覧

newを使った配列について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2023/03/08 12:40

実現したいこと

String[] any2 = { new String("A"), "B" };
の部分がよくわかっていないのでどうなっているのか知りたい

前提

出力結果がnull nullは
String[] any1 = new String[2];で二つの領域を確保しただけで何も入っていない。
拡張for文を使用しnullが二つ出力されることは理解できます

その後のA Bはなぜ(”A”)のように()がBにはつかずAだけに着くのかよくわからないので、なぜこうなるのか知りたい。

発生している問題・エラーメッセージ

無し

該当のソースコード

public class Main { public static void main(String[] args) { String[] any1 = new String[2]; String[] any2 = { new String("A"), "B" }; for (String s : any1) {System.out.print(s + "");} for (String s : any2) {System.out.print(s + "");} } } // 出力結果 // null null A B

試したこと

String[] any2 = { new String("A"), "B" };の表記はそもそも
String[] any2 = {"A","B"};でもよさそうなのに何か違いがあるのでしょうか?

補足情報(FW/ツールのバージョンなど)

徹底攻略Java SE 11 Silver問題集p225

Oracle Certified Java Programmer, Silver SE 11取得に向けて勉強中

プログラミング勉強中の初心者ですので至らない点が多々あるかと思いますが、よろしくお願いいたします!一応20分程度調べてわからなかった場合質問しております。
検索のやり方が悪いかもしれないのでその点にもアドバイスなどあればよろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2023/03/08 12:45 編集

学習のために不要な書き方や多様な書き方をするのが教科書です。 例えて言えば「This is a pen. と言わなくても Here. と鉛筆を差し出して見せればわかるのになぜこんな書き方をするのでしょうか?」と質問しているようなものです。
Crimson_Tide

2023/03/08 14:54

問題と回答と解説の概要を掲載してもらえませんか。 恐らく試験対策として解説に記載されていることを説明したいがための問題文かと思います。 ただ、any1とany2の2パターンから想像するに、Stringインスタンスの生成方法を2パターン提示しているだけのことのように感じます。
jimbe

2023/03/08 15:40

>その後のA Bはなぜ(”A”)のように()がBにはつかずAだけに着くのか new String("A") を new String と ("A") で別のモノと考えておられるのでしょうか。
退会済みユーザー

退会済みユーザー

2023/03/09 12:56

>学習のために不要な書き方や多様な書き方をするのが教科書です。 そうですね。申し訳ありませんでした。 >問題と回答と解説の概要を掲載してもらえませんか。 問題文で問われているところと別のところが気になっているので、載せても意味なさそうです! >new String("A") を new String と ("A") で別のモノと考えておられるのでしょうか。 String[] any2 = { new String("A"), "B" };これの表記がよくわかってないのでどう考えるかすらわかってないです。すみません。
maisumakun

2023/03/09 13:25

> 検索のやり方が悪いかもしれないので 基礎的な部分の構築が必要そうなので、検索で断片的な知識を調べ回るのではなく、体系だった入門をこなすべきかと思います。
jimbe

2023/03/09 16:30 編集

>String[] any2 = { new String("A"), "B" };これの表記がよくわかってない 全体は部分の集まりですので、全体と同時に部分も分からないと何にもなりません。 配列(と初期化)が分かるのでしたら、それ以前にオブジェクトの生成についても勉強しているのではないでしょうか。(私は資格は持っていないのでどんな順に勉強するのか知りません。) new String("A") は String クラスのオブジェクトを生成する文です。 "new String( ~ )" で1つで、 "new String" と "( ~ )" に分かれるモノではありません。 () 内は String クラスのコンストラクタへのパラメータです。 String クラスで文字列をパラメータに取るコンストラクタは以下です。 https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#String-java.lang.String- 文字列を文字列から生成する必要があるのかという方向であれば、ドキュメントにある >Stringは不変なので、originalの明示的なコピーが必要でないかぎり、このコンストラクタを使う必要はありません。 が1つの答えになるでしょう。
退会済みユーザー

退会済みユーザー

2023/03/10 14:04

>基礎的な部分の構築が必要そうなので、検索で断片的な知識を調べ回るのではなく、、、 一応書籍のやさしいJAVAとオラクルの教科書JAVA関連のyoutubeの動画の基礎はひと通り見たのですがまだまだ勉強不足のようですね、、頑張って勉強します。
退会済みユーザー

退会済みユーザー

2023/03/10 14:20

ドキュメントも貼っていただきありがとうございます。 >new String("A") は String クラスのオブジェクトを生成する文です。"new String( ~ )" で1つで、 "new String" と "( ~ )" に分かれるモノではありません。 これについては、おそらく理解できてると思います! String[] any2 = { new String("A") }; の場合はnewされたany2の配列のインスタンスのAが生成されるということですよね? ここにBが加わることによってよくわからなっていたのですが、 AはString[] any2 = { new String("A")}; BはString[] any2 = B; 合わせて String[] any2 = { new String("A"), "B" }; このような表記になっているのかなと自分なりに考えたのですがあっていますか?
jimbe

2023/03/10 17:11 編集

QAで無く只の勉強になってますが…概念的なものを文字だけで伝え合うのは大変です。 書籍とかネットとかで 1 人で勉強するのではなく、何とか会話で直接質問したり出来る環境でやったほうが良いと思います。 勉強を頑張るというのは素晴らしい意気込みと思いますが、質問されている内容ははっきりいってイメージさえ出来れば時間と手間をかけるようなことではありません。このようなイメージの生成は個人の経験との結合の結果ですので、直接縁の無い他者の言葉等による伝達だけではなかなか得られないと思います。 >String[] any2 = { new String("A") }; >の場合はnewされたany2の配列のインスタンスのAが生成される ちょっと変な文章で、どうイメージされているのかはっきりしませんが…。 String[] any2 = { ~ }; で配列の生成とその初期値を設定することを書いています。 any2 という配列を用意する、その初期値は {} 内に(複数の場合は ',' で区切って)並べて書くよということです。 その初期値として new String("A") で「 "A" を値として持つ String オブジェクト」を生成して渡しています。 従ってその文全体で「 String 型の配列で要素数が 1 でその一つ目が ["A" を値として持つ String オブジェクト]」が any2 となります。 初期値に ',"B"' が加わった String[] any2 = { new String("A"), "B" }; は配列の二つ目が増えるだけですので「 String 型の配列で要素数が 2 でその一つ目が "A", 二つ目が "B" 」が any2 …となります。 >~ 合わせて >String[] any2 = { new String("A"), "B" }; 「合わせて」というのが何なのか分かりませんが…。合わせた表記ということで何か納得が出来たのでしょうか。
guest

回答2

0

String[] any2 = { new String("A"), "B" };の表記はそもそも
String[] any2 = {"A","B"};でもよさそうなのに何か違いがあるのでしょうか?

new Stringは、書いての通りStringの新しいインスタンスが作られます。

"A""B"といった文字列リテラルは定数プールに格納されて、別な場所で同じリテラルが出現した時に同じインスタンスとなることがありますが、new Stringで作った文字列は他の場所の文字列と別なインスタンスとなります。


もっとも、「文字列のインスタンスが同一かどうか」を気にしなければならない場面は、一般的なプログラミングの中ではほぼ来ません。

投稿2023/03/08 14:06

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/03/09 12:56

>new Stringは、書いての通りStringの新しいインスタンスが作られます。 とてもわかりやすかったです!ありがとうございます。 String[] any2 = { new String("A"), "B" };に関してなんですけど String[] any2 = { new String("A", "B") }; String[] any2 = { new String("A"), ("B") }; このように記述するとコンパイルエラーになると思うのですが String[] any2 = { new String("A"), "B" };のように"A"にだけ()がつくのが腑に落ちてなくて何故こんな表記になるのかわかれば教えていただきたいですよろしくお願いします。
maisumakun

2023/03/09 13:18 編集

> このように記述するとコンパイルエラーになると思うのですが StringにはString2つを取るコンストラクタがないので、new String("A", "B")はコンパイルエラーとなります。 String[] any2 = { new String("A"), ("B") };は、カッコが全角になっているという問題がなければコンパイルに成功します(丸括弧の組が過剰に式中にあっても特に問題ありません)。 > "A"にだけ()がつくのが腑に落ちてなくて カッコはStringに付随するもの(コンストラクタへの引数)です。
退会済みユーザー

退会済みユーザー

2023/03/10 14:25

>String[] any2 = { new String("A"), ("B") };は、カッコが全角になっているという問題がなければコンパイルに成功します(丸括弧の組が過剰に式中にあっても特に問題ありません)。 訂正ありがとうございます勉強になりました! >カッコはStringに付随するもの(コンストラクタへの引数)です。 これを踏まえた上で自分で考えてみたのですが(他の方に送った同じ内容ですみません) String[] any2 = { new String("A"), "B" };を分解してみると String[] any2 = { new String("A") }; の場合はnewされたany2の配列のインスタンスのAが生成されるということですよね? ここにBが加わることによってよくわからなっていたのですが、 AはString[] any2 = { new String("A")}; BはString[] any2 = B; 合わせて String[] any2 = { new String("A"), "B" }; このような表記になっているのかなと自分なりに考えたのですがあっていますか?
guest

0

new String("A")

ってのは、”A"の中身を持つ文字列を生成してるってことなので、"A"です。

String[] any2 = {"A","B"};でもよさそうなのに何か違いがあるのでしょうか?

違いないです。
なぜそう書くのかってのは、これを書いた人に聞きましょう

投稿2023/03/08 13:31

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2023/03/08 14:07

実用的にはともかく、プログラム上から検知可能な違いはあるので、別回答にまとめました。
退会済みユーザー

退会済みユーザー

2023/03/09 12:57

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問