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

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

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

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

Q&A

解決済

2回答

5768閲覧

java オブジェクトの生成コストに関して

anonymous001

総合スコア96

Java

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

0グッド

0クリップ

投稿2015/04/18 17:20

javaにおいてgetXXX()というメソッドはオブジェクトを返すことが多いと思います(javaに限らずですが)

例えば1つの処理の中でgetXXXを複数呼ぶ場合,その都度オブジェクトが生成されていることになるんでしょうか

lang

1 : 2tmpFunc(dto.getXXX()); 3 : 4z = dto.getXXX(); 5 : 6w.setTmp(dto.getXXX());

下記のように一旦変数に入れて、それを使いまわしたほうがメモリの節約になりますか?

lang

1 : 2Object obj = dto.getXXX(); 3tmpFunc(obj); 4 : 5z = obj; 6 : 7w.setTmp(obj);

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

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

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

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

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

guest

回答2

0

ベストアンサー

単に呼び出し先クラスのインスタンス変数を返しているだけであれば

オブジェクトが生成されていること

…には、なりません。単に関数呼び出しのオーバーヘッドが少しだけある、という程度でしょうか。
数千・数万回のループをするようなら一回変数に持った方が良いですが、そうでなければ、それほどボトルネックになることはないでしょうね。

もちろん、 getXXX の実装内容が単にインスタンス変数を返すものでなく込み入った処理なのであればまた事情が変わってきます。

余談。インスタンス変数はintで持っているのにメソッドの型がIntegerの場合、プリミティブ型のintを元に暗黙的にInteger型のインスタンスが生成されてしまい思わぬボトルネックになります。float,doubleなども同様です。

投稿2015/04/18 17:31

AknEp

総合スコア200

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

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

anonymous001

2015/04/18 17:48

ありがとうございます。getter,setterのようなメソッドだとインスタンス変数になるので、たしかにそうですね。 getXXX(){ String tmp = "aaaa"; return tmp; } このようなケースでは毎回オブジェクト生成につながりますか? あと余談のケースですが それはインスタンス変数がIntegerだと問題ないってことですよね? ①int -> Integer ②int -> int ③Integer -> Integer  ①が遅くて、②③は同程度ってことでよろしいでしょうか
AknEp

2015/04/18 20:07

> このようなケースでは毎回オブジェクト生成につながりますか? コードを正直に眺めた感じでは、生成に繋がると思われます。 但し、Stringは不変クラスですし、組み込みのクラスなので、何らかの効率化が施されていれば…あるいは、コンパイラによる最適化やJITによる効率化によって、インスタンス生成がスキップされる可能性はあります。 > ①が遅くて、②③は同程度ってことでよろしいでしょうか ベンチマークを取ってみないと正確なところは言えないんですが、大きく違わないでしょうね。 確かこれは Effective Java に書いてました。
nagise

2015/04/20 05:22

余談ですが int -> Integer のオートボクシングに際してはInteger#valueOf()の実装が用いられるのですが、javadocに記載があるように値がキャッシュされるなどパフォーマンスについては配慮がみられます。 http://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#valueOf-int- > このメソッドは、-128から127の範囲(両端含む)の値を常にキャッシュしますが、この範囲に含まれないその他の値をキャッシュすることもあります。
guest

0

getterの実装に依りますね。
Java自身、バージョンを重ねるにしたがって最適化が進んでおり、現状ではかなり高速に動きます。
小さなオブジェクトをnewするコストは、およそ気にする必要はありません。(簡単に実測すると分かりますが、よほどパフォーマンスが重視される箇所でない限りは費用対効果に見合わないものでしょう)

おおきなオブジェクトであればnew によってメモリを多く消費しますので間接的にGC(ガーベッジコレクション)の発生頻度を高めます。
また、オブジェクトによっては生成の際に多くの処理を行って時間がかかることもあります。

一般的なgetterではフィールドの値を返却するだけのものが多く、パフォーマンスとしては実測してみても数字に現れない程度だろうと思います

投稿2015/04/20 05:16

編集2015/04/20 05:20
nagise

総合スコア87

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問