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

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

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

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

Q&A

解決済

4回答

382閲覧

returnで値をintからStringに変えるとき、順番は関係するのでしょうか

budousan

総合スコア13

Java

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

0グッド

1クリップ

投稿2019/10/03 03:55

Javaのコードに関しての質問なのですが、以下の二つで違いが出るのかがわからず、それを調べる方法もわかりません。

return value + "";

return "" + value;
です。

ソースコードでは、valueはもともとIntで値が与えられていて、if文を使いStringにして返すというメソッドでの一文です。
上の二つに違いはあるかという問題にぶつかり、解き方がわからずに困っています。
説明のなど至らない点があると思いますが、ご回答いただければ嬉しいです。

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

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

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

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

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

m.ts10806

2019/10/03 04:00

そもそもなぜ違いがあるのかを考えることになったのでしょうか。 そもそも「違い」は何を想定して言ってますか?
dice142

2019/10/03 04:05

一発勝負でない限り、まずは試してみましょう。 一発勝負であってもネット使えるくらいならpaiza.io等で試すことは出来るはずですので。
guest

回答4

0

実際にやってみましょうよ。
わざわざ他人に聞かなくてもすぐに確認できますぜ

投稿2019/10/03 04:16

y_waiwai

総合スコア87749

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

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

0

質問文のコードは試してもらうとして、
以下の場合でもどうなるか試してみると良いですね。

return "" + value + 10;
return value + 10 + "";

考えるべきところは
int + int → int
int + String → ?
String + int → ?
String + int + int → ? + int → ?
int + int + String → int + String → ?
これらの?がそれぞれどうなるか、という感じですね。

投稿2019/10/03 04:45

dice142

総合スコア5158

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

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

0

誰もやろうとしないので、以下のプログラムを使って実行時間を実測してみました。

Java

1import java.util.stream.IntStream; 2import java.util.function.IntConsumer; 3import java.util.Arrays; 4 5public class TestStr { 6 public static void main(String... args) { 7 final var max = Integer.parseInt(args[0]); 8 final var count = Integer.parseInt(args[1]); 9 final var num = Integer.parseInt(args[2]); 10 System.out.println("数の幅: 0 - " + max); 11 System.out.println("繰り返し数: " + count); 12 System.out.println("サンプル数: " + num); 13 final var bs = new long[num]; 14 final var as = new long[num]; 15 // 一回目は切り捨て 16 for (int n = 0; n < num; n++) { 17 bs[n] = benchmarkNanoSec(max, count, i -> { 18 intToStrBeforeString(i); 19 }); 20 as[n] = benchmarkNanoSec(max, count, i -> { 21 intToStrAfterString(i); 22 }); 23 } 24 // 二回目本番 25 for (int n = 0; n < num; n++) { 26 bs[n] = benchmarkNanoSec(max, count, i -> { 27 intToStrBeforeString(i); 28 }); 29 as[n] = benchmarkNanoSec(max, count, i -> { 30 intToStrAfterString(i); 31 }); 32 } 33 34 System.out.printf("文字列の前 平均: %.2f ms\n", Arrays.stream(bs).average().orElse(0) / 1000 / 1000); 35 System.out.printf("文字列の後 平均: %.2f ms\n", Arrays.stream(as).average().orElse(0) / 1000 / 1000); 36 } 37 38 public static String intToStrBeforeString(int value) { 39 return value + ""; 40 } 41 42 public static String intToStrAfterString(int value) { 43 return "" + value; 44 } 45 46 public static long benchmarkNanoSec(int max, int count, IntConsumer f) { 47 final var startNanoTime = System.nanoTime(); 48 for (int i = 0; i < count; i++) { 49 IntStream.range(0, max).forEach(f); 50 } 51 final var endNanoTime = System.nanoTime(); 52 return endNanoTime - startNanoTime; 53 } 54}

BellSoftのLiberica JDK 11.0.5(openjdk version "11.0.5-BellSoft" 2019-10-15) 64bit Windowsでの結果は下記になりました。

text

1数の幅: 0 - 100000 2繰り返し数: 1000 3サンプル数: 5 4文字列の前 平均: 1113.83 ms 5文字列の後 平均: 1117.35 ms

誤差の範囲と言ってもいいぐらいほぼ一緒です。Liberica JDK 11についてはパフォーマンスについて違いは無いと言っていいと思います。他のJDK実装や過去のバージョンは確認していません。古い(1.4ぐらい?)Javaだと文字列結合にStringBufferを使っていたりしていて、今とはコンパイル後のコードが異なるらしいので、違いは出るかも知れません。

投稿2019/10/30 11:37

raccy

総合スコア21735

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

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

ikadzuchi

2019/10/30 12:46

なるほど、出力結果の差のみを考えていて、実行時間の差については思い至りませんでした。
guest

0

ベストアンサー

演算子の言語仕様について知りたいので、「java 演算子 仕様」あたりで検索します。
こちらのページが見つかりました。
http://www.y-adagio.com/public/standards/tr_javalang/15.doc.htm#15746

  • 演算子のいずれかのオぺランドの型がStringならば,演算は文字列の連結とする。

および

一つのオペランドの式だけが型Stringならば,実行時に文字列を生成するために,他方のオペランドに対して文字列変換を実行する。

とあるので、どちらの場合も同じくvalueはStringに変換されるようです。

結果は二つのオペランドの文字列を連結して新たに作成したオブジェクト String への参照とする。

とあるので、(どちらかのオブジェクトが残るのでなく)両オペランドとは無関係なオブジェクトとなり違いは生じなさそうです。

あとは空文字列と空でない文字列を連結した時に順序によって何か違いが生じるかですが、普通に考えて違いは無さそうな気はするものの確信が持てません。

投稿2019/10/03 15:58

ikadzuchi

総合スコア3047

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

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

Zuishin

2019/10/17 01:38

違いがあるかどうかは試してみれば一発でわかることですが、この回答は質問に対し「確信が持てません」と言っているだけですね。
swordone

2019/10/17 02:49

だから、何をもって「同じ/違う」と評価するのか、その基準が無ければこの議論に意味はありませんよ。
ikadzuchi

2019/10/17 13:29

> 違いがあるかどうかは試してみれば一発でわかること 違いがあるかどうかを試せば分かるかどうかは自明ではありません。 簡単に結果を確認できない点で違いが出るかもしれません。 > 「確信が持てません」と言っているだけ 「それを調べる方法もわかりません」という点について調べ方を回答していますので内容は「確信が持てない」だけではありませんし、確信が持てない回答を書くべきでないとも思いません。 > 何をもって「同じ/違う」と評価するのか、その基準が無ければ 私もそう思います。
Zuishin

2019/10/17 13:36

参照であれ、値であれ、その他の何であれ、何をもって同じとするかが決まっていれば、試してみれば一発でわかることでしょう。返却しているのは新しいオブジェクトです。 それと確信を持てない回答が悪いと言っているのではなく、単なる「確信を持てないという結論」でしかないのは、情報量 0 で誰も得しない無意味な回答ということです。y_waiwai さんの回答と同じスコアですが、向こうの方がまだ有益です。
ikadzuchi

2019/10/17 13:59

> 何をもって同じとするかが決まっていれば、試してみれば一発でわかる 何を持って同じとするかが分からない、あるいはあらゆる点について違いがあるかを知りたい状態と判断しました。 > 返却しているのは新しいオブジェクトです。 そのようですがそれが何か? > 単なる「確信を持てないという結論」でしかないのは、情報量 0 「確信を持てないという結論」なのは最後の1文のみですので、それ以外の文には情報量を認めてもらえたものと思います。 その上で、この文には「確信が持てない部分が残っている」という情報があります。
Zuishin

2019/10/17 14:08

何の情報がありますかね。戻り値に関係ないことばかりの気がしますが。
ikadzuchi

2019/10/17 14:21

私が考察したあたりの内容は戻り値に関係あるかどうかは自明ではなく、回答に含めるべきだと考えました。
Zuishin

2019/10/17 14:26 編集

> 以下の二つで違いが出るのかがわからず、それを調べる方法もわかりません。 これが質問です。 どのような違いが出るのか、そしてどのようなところが同じなのか、調べる方法とともに書けば済む話ですが、そこには一切触れられず余談と感想のようなものしか書いていません。 なぜそんなに自信満々なのか理解に苦しみます。
ikadzuchi

2019/10/17 14:58

> どのような違いが出るのか、そしてどのようなところが同じなのか、調べる方法とともに書けば 出力がわを検査するということでしょうか。その方針もあると思いますが、私はコードを見てどこで違いが出そうかを言語仕様から確かめる方法をとりました。 > なぜそんなに自信満々なのか理解に苦しみます。 それなりに長い間生きてきて、自分の発言に対する態度として今のような態度でそれなりにうまくいっているという経験からでしょうかね。
Zuishin

2019/10/17 15:02 編集

この情報量 0 の回答に関しての自信のことを言ったんですが、まあ長い間生きて自信がついたのは何よりです。ちなみに、そのアイコンは何という萌えキャラですか?
ikadzuchi

2019/10/30 12:54

コメントを編集されると気づけず反応できないのでやめていただけませんかね。 情報量0というのはあなたの考えにすぎませんね。私は情報量が0でないと思っており、人に否定されても納得できなければ意見を変えないのがそれなりに生きてきて身につけた自分の発言に対する態度です。 アイコンの萌キャラはオリジナルで特に名前はありません。
Zuishin

2019/10/30 13:32

あなたの返信がある前の編集なので特に問題はないと思いますが。 あなたが意見を変えようが変えまいが、情報量 0 なのは事実なのでお好きに。
ikadzuchi

2019/10/30 15:56

確認した上で返信の必要なしと判断したんです。
Zuishin

2019/10/30 15:59

あなたがいつ確認するかなど、私が知るわけがありません。
ikadzuchi

2019/10/30 16:34

当然ですね。それがどうかしましたか? 話を戻しますが私が確認した後にコメントを編集されると気づけず反応できないのでやめてください。
Zuishin

2019/10/30 21:02

気づいたじゃないですか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問