トップページ⇒tech
1002コメント343KB

Java入門・初心者質問スレ [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/05/12(木) 05:18:33.40ID:nzHoBPh8
Java初心者のためのスレッドです。
0685デフォルトの名無しさん2016/10/01(土) 22:49:48.80ID:VDFFrXl+
>>682
すいません学生ではなく独学で勉強をしておりますが友人など聞ける相手がおりませんのでここで聞かせてもらっております涙
0686デフォルトの名無しさん2016/10/01(土) 22:52:12.08ID:kr3+PnGk
>>684 そうだよ
import aiueo.Abc;
pubilc class Main{
public static void main(String[] args)
throws Exception{
Abc abc = new Abc()
abc.zenhan();
abc.kouhan();
aiueo.Def.mae();
aiueo.Def.usiro();
}
}
0687デフォルトの名無しさん2016/10/01(土) 22:53:51.74ID:kr3+PnGk
>>685 真面目ですね、応援してます
0688デフォルトの名無しさん2016/10/01(土) 22:53:57.21ID:VDFFrXl+
>>683
調べ不足かもしれませんがなかなか理解できる内容のものがなくここでつまずいております...もしかしたらクラスパスとのことでしたがpackageの2つともはdocumentに入っているのですがdocumentを読み込んでいないと言う事でしょうか?
0689デフォルトの名無しさん2016/10/01(土) 22:58:06.17ID:kr3+PnGk
>>688 ドキュメントってWindowsの?
普通にフォルダの中にいれて、環境変数で登録でいいんじゃないかな
0690デフォルトの名無しさん2016/10/01(土) 22:59:59.19ID:VDFFrXl+
>>687
ありがとうございます。本当に嬉しいです
0691デフォルトの名無しさん2016/10/01(土) 23:00:52.76ID:VDFFrXl+
>>689
すいません osはmacのosXです
0692デフォルトの名無しさん2016/10/01(土) 23:01:27.27ID:kr3+PnGk
IDE使えないとかめんどくさいな
コンパイルの時はjavac aiueo.Abc aiueo.Def Main でやってみたらいい
0693デフォルトの名無しさん2016/10/01(土) 23:02:06.77ID:MIaIeT8n
ちなみに誰が出してる課題?
0694デフォルトの名無しさん2016/10/01(土) 23:02:28.95ID:kr3+PnGk
>>691 ならeclipse入れたほうが早いよ、その辺全部やってくれるからコード書くだけでいいし
0695デフォルトの名無しさん2016/10/01(土) 23:06:04.41ID:kr3+PnGk
>>681 課題という事はIDEダメなパターンか
てか独学って話と矛盾してるなー
最後は自分の力で解いたほうがいいと思うよヒントとしてMac クラスパスでググるのと、パッケージが見つかりませんでググってみそれで解ける問題だよ
0696デフォルトの名無しさん2016/10/01(土) 23:06:24.88ID:VDFFrXl+
>>693
課題は本から練習問題としてでております
0697デフォルトの名無しさん2016/10/01(土) 23:07:36.81ID:VDFFrXl+
>>694
今はターミナルでやっていたのでExlipseを試してみようと思います
0698デフォルトの名無しさん2016/10/01(土) 23:08:39.48ID:VDFFrXl+
>>695
すいません言い方が悪かったですね本はjava入門第二版を使っております。
0699デフォルトの名無しさん2016/10/01(土) 23:09:11.39ID:wXi+U7q2
>>663
DBの符号化方式でエンコードしてNGなら削除してしまえばいんじゃないかな
https://paiza.io/projects/qi1DzWG79KCNqIMTw5S92Q
0700デフォルトの名無しさん2016/10/01(土) 23:11:31.78ID:kr3+PnGk
>>697 それがいい
0701デフォルトの名無しさん2016/10/01(土) 23:15:06.37ID:MIaIeT8n
こんなことで詰まってると3日で飽きるからな
0702デフォルトの名無しさん2016/10/01(土) 23:21:57.93ID:VDFFrXl+
>>700
今日は本当にありがとうございました
0703デフォルトの名無しさん2016/10/01(土) 23:24:03.63ID:VDFFrXl+
>>701
恥ずかしながら全くもってその通りだと思います。才能が無い事は承知しておりますがこれからも精進させていただきます。
0704デフォルトの名無しさん2016/10/01(土) 23:29:35.31ID:kr3+PnGk
>>703 才能ないなんて簡単に決めるなよ
次の章のほうが大切だからそっからやったら前半の章は充分だろその知識使わないし
0705デフォルトの名無しさん2016/10/01(土) 23:59:22.65ID:fIXH2k8W
飽きさえしなければどうにでもなる
0706デフォルトの名無しさん2016/10/02(日) 08:36:31.88ID:v1qy4+iE
>>647
Java VMが管理しているアドレスだから概念は同じと思っていいが、CやC++みたいなアドレスとしてプログラムは作れない。
0707デフォルトの名無しさん2016/10/02(日) 08:40:13.37ID:v1qy4+iE
>>662
あいつは英語の一般的な意味のポインタがなんなのか知らないだけだろ。
0708デフォルトの名無しさん2016/10/02(日) 12:32:57.39ID:4o4y3Pue
>エグゼプション
には突っ込まんのか
0709デフォルトの名無しさん2016/10/02(日) 14:27:57.94ID:SUd5Exqx
インターフェイスのインスタンスは作れないと思ってんですが、こうするとインスタンス作ってるっぽくなるんですが、どういうことなんでしょうか?
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ

Runnable runnnable = new Runnable(){
public void run(){}
};
}
0710デフォルトの名無しさん2016/10/02(日) 14:38:32.13ID:O1+Xevaf
>>709
インタフェスを継承したクラス(匿名クラス)を定義して匿名クラスのインスタンスを作成してる
0711デフォルトの名無しさん2016/10/02(日) 14:44:40.68ID:SUd5Exqx
>>701
ありがとうございます。
確かに、MainClass.classとは別に、MainClass$1.classというクラスファイルが作られていました。
0712スッキリ厨2016/10/02(日) 14:58:44.60ID:mO5jHYyT
>>664
C++で、賞を取った、平山尚のセガ本が、2008年に出た。
この本の中で、C++・オブジェクト指向・ゲームプログラミングを、
1冊で説明できる本があれば、ベストセラーになるって、平山が言ってる

その後、2011年に、無名の著者2人による「スッキリJava」が出た。
C++では無理だったことを、Java・オブジェクト指向の説明で、1冊を仕上げた。
また、イラストをふんだんに使い、最初からコストを度外視して、本を作ったw

2011年を、オブジェクト指向のエポックと呼んで、
2011年を境に、スッキリ以前・スッキリ以後と呼ぶ

今では、C++・オブジェクト指向を学ぶ人も、この本から始めるという、道筋も作った

これは、林晴比古・柴田望洋・宮本信二・結城浩・高橋麻奈など、
大御所たちが成しえない偉業であった
0713デフォルトの名無しさん2016/10/02(日) 18:58:36.14ID:+XYb/4p3
俺のスレ
0714デフォルトの名無しさん2016/10/02(日) 19:16:33.86ID:+XYb/4p3
>>707
猟犬だよな
0715デフォルトの名無しさん2016/10/02(日) 19:20:04.24ID:+XYb/4p3
>>712
へー。そんな本が2011年に出ていたとは知らなかった。
0716デフォルトの名無しさん2016/10/02(日) 22:37:08.72ID:v1qy4+iE
>>712
C++自体がオブジェクト指向設計専用ではないために、C++プログラマが説明しても、学習する方からしたら実際には全然、オブジェクト指向プログラムでないものができて動くから理解が難しいんだよ。
0717デフォルトの名無しさん2016/10/04(火) 19:04:40.41ID:rJSgKoMJ
public static void main(String[] args) {
int i = 2;
System.out.println(1+i++);
}
が3になるのはなぜでしょうか?
0718デフォルトの名無しさん2016/10/04(火) 19:15:35.05ID:ksk/TL7I
表示されるときはまだ++まで辿り着いてないからかな
0719デフォルトの名無しさん2016/10/04(火) 19:18:07.09ID:WEyUe7wf
>>717
後置インクリメント演算子は処理が終わった後+1するから。
つまり1+i(この時点では2)の値を表示し、その後iは3になる。
もしiを1加算した結果を表示したいのなら++iを使う必要がある。
0720デフォルトの名無しさん2016/10/04(火) 19:34:21.50ID:rJSgKoMJ
>>719
ありがとうございます。
>処理が終わった後+1
という点ですが、どういう事が起きれば"処理が終わった"ということになるのでしょうか?
例えば、
int i = 2;
System.out.println((double)(i++));  //出力2
だと、自分の頭の中では、i++した後に、double型への変換という"処理が終わった"から3になっていて欲しいと考えてしまうんですが。
根本的に頭おかしかったらすみません・・・
0721デフォルトの名無しさん2016/10/04(火) 19:47:20.31ID:KPMHhtfC
スレチかもしれないけど
基本情報技術者のJavaってどこらへんまで理解してればいいの?

何問か解いたらコレクションやジェネリクスとかくらいまでだったから安心してたけど
他の年の見たらスレッドとか出てた...
0722デフォルトの名無しさん2016/10/04(火) 20:02:04.37ID:fCGdMFkh
基本情報・応用情報ともにJavaで受けたけど当時はPHPの経験のみでJavaの経験ほぼ皆無だったけど行けたぞ


そんなに意識するほどJavaだけに依存するような問題でない
0723デフォルトの名無しさん2016/10/04(火) 20:10:20.62ID:WEyUe7wf
>>720
printlnを実行したら、だと思う。
>>717のプログラム文の後に、System.out.println(i);で表示してみて。3になってると思う。
0724追記2016/10/04(火) 20:42:57.79ID:WEyUe7wf
>>720
doubleでのキャスト→printlnによる表示(この時点でiは2)→後置インクリメントによるiへの1加算、の順だと思う。
0725デフォルトの名無しさん2016/10/04(火) 20:54:16.80ID:L2FSf/5N
>>717
1+(i++) と同じだからでは?
07267172016/10/04(火) 20:59:41.12ID:rJSgKoMJ
すみません。キャストとか何も考えずにですが、頭まとまってないままレス書いてます。

int i = 2;
System.out.println(++i);
の場合
0 : iconst_2   //int型の2をオペランドスタックにpush
1 : istore_1   //ローカル変数領域の1番目に2を格納(0番目は違うデータ)
2 : getstatic #16 //System.out.PrintStream
5 : iinc 1, 1   //1番目のローカル変数(ここではi(=2))を1インクリメントする
8 : iload_1    //ローカル変数 i をオペランドスタックへpushする
9 : invokevirtual #22 //println実行


int i = 2;
System.out.println(i++);
の場合
0 : iconst_2
1 : istore_1
2 : getstatic #16
5 : iload_1      //ローカル変数 i をオペランドスタックへpushする
6 : iinc 1, 1     //1番目のローカル変数(ここではi(=2))を1インクリメントする
9 : invokevirtual #22

これだと、
++i の場合、ローカル変数領域でインクリメントした値をオペランドスタックにプッシュしてprintlnしている。
i++ の場合、iをオペランドスタックにプッシュした後、ローカル変数領域でインクリメントしている。

つまり、printlnで出力される値はオペランドスタック内での値で、インクリメントされるのはローカル変数領域の値。
ローカル変数領域の値をインクリメント前後のどっちのタイミングで取り出すかで結果が違った。

これでいいんでしょうか?
0727デフォルトの名無しさん2016/10/04(火) 21:03:58.76ID:L2FSf/5N
>>720
処理が終わった後というか、変数から値を取り出した後と考えた方が良いと思う(でないと (i++) + (i++) みたいな式はどうなるのかわからなくなる)。

式の計算を実行する時には変数から値を取り出してそれを利用するわけだが、取り出した直後に変数の方にだけ1加算するのが後置の++。
0728デフォルトの名無しさん2016/10/04(火) 21:07:47.13ID:L2FSf/5N
>>726
そうそう。ズバリそれ。
0729デフォルトの名無しさん2016/10/04(火) 21:10:07.17ID:rJSgKoMJ
>>727
ありがとうございます。
そのケースだと、最初の(i++(値は2))+((i++)左でインクリメントされて3)
で、合計5になると思います。だいぶスッキリしました。
0730デフォルトの名無しさん2016/10/04(火) 23:06:35.38ID:qcWHR4bx
すいません、日付の取得について教えてください。
年・日付でyyyymm
1回目:201610
2回目:201609
?
12回目:201510

のように1ヶ月ずつマイナスの値が取りたいのですが、どのようにロジックを組み立てれば良いでしょうか。
0731デフォルトの名無しさん2016/10/04(火) 23:12:00.06ID:YN9fMNzy
mm = (mm+11)%12 というロジックを組み立てましょう
07327302016/10/04(火) 23:33:28.45ID:qcWHR4bx
カウンタが12以上だった場合と
カウンタが月より大きかった場合と
素直にカウンタが月より小さい場合の3パターンぐらい作ればOKですか?
0733デフォルトの名無しさん2016/10/04(火) 23:37:38.44ID:rJSgKoMJ
>>730
public static void main(String[] args) {
LocalDate date = LocalDate.now(ZoneId.systemDefault());
for(int i = 0; i < 10; i++){
LocalDate date2 = date.minusMonths(i);
System.out.println(date2.format(DateTimeFormatter.BASIC_ISO_DATE));

}
}
こんなのどうでしょう?
0734デフォルトの名無しさん2016/10/04(火) 23:48:00.86ID:qcWHR4bx
>>733
こちらのほうが早いですね。
カウンタが12以上
カウンタが月より大きいが12未満
カウンタが月と同じ
カウンタが月以下

のパターンで考えていましたが733さんのやり方を採用させていただきます。
ありがとうございました。
0735デフォルトの名無しさん2016/10/05(水) 02:30:23.26ID:D107n7zL
他スレでも似たようなことを聞いたのですが、コンストラクタはメソッドとは「異なる」ものでしょうか?
0736デフォルトの名無しさん2016/10/05(水) 04:32:37.11ID:6T6LA8v8
>>735
異なります。
まずクラスからインスタンスが生成されるのは分かると思います。
インスタンスを生成する際に、1つのインスタンスにつき最低1回自動的に実行されるものです。
(メソッドは意図的に呼び出さないと使われない)
※最低1回というのは、コンストラクタから他のオーバーロードコンストラクタを実行することも可能な為。

また、メソッドは定義しないと存在しえないけれど、コンストラクタは定義しなくても引数なしのデフォルトコンストラクタが勝手に作られます。
0737デフォルトの名無しさん2016/10/05(水) 06:41:11.69ID:SMYY1Ign
一つのクラスにメソッドはいくつまで作れますか?
0738デフォルトの名無しさん2016/10/05(水) 07:28:34.08
最初の配列の中身が { あ , い , う , え , お } だとして
例えば、要らない3番目の要素を削って、 { あ , い , え , お }としたいのだけど
for文で回したいと言う事もあって配列の要素の数減らしたい場合はどうすればいいのですか
0739デフォルトの名無しさん2016/10/05(水) 08:13:14.18ID:EDqQ344L
固定長でないなら配列の用途外だ
Listを使え
0740デフォルトの名無しさん2016/10/05(水) 08:20:02.52ID:5Xz9WIc6
>>730
1引く。
結果 modulo 100が0ならさらに88引く
201501 -1
201500 -88
201412
0741デフォルトの名無しさん2016/10/05(水) 08:37:57.34ID:UjqhNziY
>>740
Stream<Integer> yearmonth = Stream.iterate(201610, i -> {
if (--i % 100 == 0)
i -= 88;
return i;
});
yearmonth.limit(12).forEach(System.out::println);
0742デフォルトの名無しさん2016/10/05(水) 09:52:26.11ID:Aes2Pyfc
>>740
このロジック思い浮かぶやつは頭おかしい。
0743デフォルトの名無しさん2016/10/05(水) 12:08:28.26ID:5Xz9WIc6
>>742
確かど貧民なプロジェクトで書いたはず。
組み込みかなんか。
足す方も作った覚えがある。13なら88足す。
07447352016/10/05(水) 20:10:55.24ID:D107n7zL
>>736
なるほど。
ありがとうございました。
0745デフォルトの名無しさん2016/10/06(木) 02:31:43.46ID:qC7uJdLp
>>737
いくつでも作れるんじゃない。容量が許す限り。
コンストラクタは引数の性質上作れるバリエーションは限られるけど。
0746デフォルトの名無しさん2016/10/06(木) 10:43:24.14ID:j4+P2uPZ
http://stackoverflow.com/questions/4342072/what-is-the-maximum-number-of-methods-a-java-class-can-have
どのくらいメソッドを扱えるかはJVM側の仕様でJava自体は制限ないらしい
0747デフォルトの名無しさん2016/10/06(木) 12:21:38.86ID:Yw0Cruyw
>>738-739
java.util.Vectorは、オワコンらしいので、ArrayList を使うのかな?
0748デフォルトの名無しさん2016/10/06(木) 20:29:56.72ID:NGtUq8vU
そういや昔Vectorって中で配列使ってたりして効率悪いって話を聞いたことあるんだけどその後どうなったんだろう?
中身をこっそりListの何かと同じになるように書き換えちゃえばさほど効率悪くならないような気がするが。
0749デフォルトの名無しさん2016/10/06(木) 21:05:11.45ID:JthKKgNo
*Array*Listって中で何使ってると思う?
0750デフォルトの名無しさん2016/10/07(金) 02:42:47.54ID:SQT7x/O/
あれー
0751デフォルトの名無しさん2016/10/07(金) 08:01:12.25ID:ZgfNPSik
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Vector.html
> このクラスは、Java 2プラットフォームv1.2の時点でListインタフェースを実装するように改良された結果、
> Java Collections Frameworkのメンバーとなりました。新しいコレクションの実装とは異なり、Vectorは同期をとります。
> スレッドセーフな実装が必要ない場合は、Vectorの代わりにArrayListを使用することをお薦めします。

つまり……どういうことだってばよ?
0752デフォルトの名無しさん2016/10/07(金) 08:33:18.57ID:RR6e4vg9
スレッドセーフな実装はStringBufferとStringBuilderの関係に似ているね
0753デフォルトの名無しさん2016/10/07(金) 09:19:54.59ID:NAyeSbqf
>>751
翻訳するとおそらく以下のようなことを言っているものと思われます。


中はどうなってるか言ってもどうせお前らアホにはわからないから言わないがinterfaceはとにかくListだ。忘れるなボケ。
スレッドセーフにしたいなら Vector を使え。そうじゃなくていいなら ArrayList だ。わかったかクソ虫ども。
0754デフォルトの名無しさん2016/10/07(金) 12:28:23.51ID:5FJeiwoZ
そして、ArrayListを同期で使用したいなら、Collections.synchronizedList使えってことか。
0755デフォルトの名無しさん2016/10/08(土) 04:25:38.70ID:MCoYyYao
このスレの最初の方って結構重要な事書いてありますね。
0756デフォルトの名無しさん2016/10/08(土) 08:45:08.84
for文、while文の { } に入れてループさせるのではなく、
条件が合った場合(=合わなかった場合)、まるでリセットさせるがごとく最初からまるまるもう一度やり直すことはできるのでしょうか
0757デフォルトの名無しさん2016/10/08(土) 09:14:17.22ID:OjXU7tHb
再帰構造にするとか?
0758デフォルトの名無しさん2016/10/08(土) 09:48:46.83ID:i5kDCKwM
本質的に条件が整うまでループと何が違うのかと
0759デフォルトの名無しさん2016/10/08(土) 10:28:54.32ID:4paVmbm0
continueみたいなキーワードで、そーゆーことができるか?という問いなら
「できません」
0760デフォルトの名無しさん2016/10/08(土) 12:23:10.31ID:I5GBlv/H
>>759
ラベル付きcontinueで出来るでしょ
あまりやらないけど
0761デフォルトの名無しさん2016/10/08(土) 12:23:56.52ID:I5GBlv/H
間違えた
ラベル付きbreakだった
0762デフォルトの名無しさん2016/10/08(土) 12:38:17.30ID:y0liF3+j
これが D になるのはなぜでしょうか?
文字列リテラルが不変なのは分かるのですが、newすれば普通にヒープに作られる参照型ですよね?

String d = new String("D");
String e = new String("E");
String f = new String("F");
String[] str3 = new String[]{d,e,f};   //文字列定数でなく文字列インスタンスへの参照の配列のつもり
String[] str4 = new String[str3.length];
System.arraycopy(str3,0,str4,0,3);    //参照をコピー
str3[0] = new String("P");
System.out.println(str4[0]); //実際はDだけど、str4[0]はstr3[0]からコピーされた「文字列インスタンスPへの参照」なのでPであって欲しい。
07637622016/10/08(土) 12:40:41.84ID:y0liF3+j
すみません間違えました。忘れてください・・・
0764デフォルトの名無しさん2016/10/08(土) 14:57:31.05ID:vUUOaV1U
日本情報技術取引所
口座借り
多重ぐるぐるドナドナ案件
コンピューターレスキュー
角度があがります
0765デフォルトの名無しさん2016/10/08(土) 17:34:37.69ID:nKRNJJPF
>>763
自分のやっていた事の真実に気付いたようだね。
07667552016/10/08(土) 20:39:45.53ID:MCoYyYao
スッキリわかる=最強だと思ってたのに…。
0767デフォルトの名無しさん2016/10/08(土) 22:38:12.56ID:cRcu85q4
スッキリ最強説は、以下を参照

推薦図書/必読書のためのスレッド 80
http://echo.2ch.net/test/read.cgi/tech/1472262077/222-236
0768デフォルトの名無しさん2016/10/08(土) 23:29:22.24ID:XNEtFwHJ
シングルスレッドでのプログラムで
メンバ変数に値をセットするやり方は間違ってますか?
メソッドのネストが引数として渡して渡して・・・ってやり方が本来は正しいのかもしれませんが…
Javaだとそういう場合もセッタゲッタでのやり方が望ましいんでしたっけ?
07697662016/10/09(日) 00:56:36.11ID:CesbDVy8
>>767
スッキリ厨って人のレスはアテになりませんからねぇ。
0770デフォルトの名無しさん2016/10/09(日) 02:52:17.93ID:h5veqgjK
>>768
日本語でおk
0771デフォルトの名無しさん2016/10/09(日) 12:36:05.23ID:yMllKpMI
>>768
基本メンバ変数は値を保持しとく必要がある物にとどめたほうがいい、publicな(外部から呼ばれる)メソッド無いで共通して利用するものとか
今回のケースでは引数で渡していくほうがいいと思う
0772デフォルトの名無しさん2016/10/09(日) 13:10:13.87
Math.random で1〜99までの乱数を何万回発生させるとなると、実行するたび違う値、順番になりますが、
プログラムをもう一回実行したら毎回同じ数字の順序でちゃんと乱数っぽい数字を発生させる方法はありますか?
自分で乱数をあらかじめ用意しておくという手もありますが、できればコンピューターのほうで用意してもらえればと
実行環境によって結果が違ってくる分には構わないのですが・・・
0773デフォルトの名無しさん2016/10/09(日) 13:32:38.51ID:okPyT/Vt
java.utl.Ramdomで同じseedを使えばよい
0774デフォルトの名無しさん2016/10/09(日) 14:59:12.57
import java.util.Random ;

Random a = new Random( ) ; //普通の乱数
int x = a.nextInt(99)+1 ;

Random b = new Random(1) ; //1をシードとして指定
int y1 = b.nextInt(99)+1 ;;
int y2 = b.nextInt(99)+1 ;

Random c = new Random(1) ; //1をシードとして指定
int z = c.nextInt(99)+1 ;

System.out.println( x + ":" + y1 + ":" + y2 + ":" + z ) ;


実行結果
40:16:29:16
95:16:29:16
56:16:29:16


ありがとうございます
0775デフォルトの名無しさん2016/10/09(日) 19:18:21.24ID:QWyuhQzX
一回試した結果をファイルに保存して
それを毎回読み込めば
どの環境でも同じ
0776デフォルトの名無しさん2016/10/10(月) 05:07:03.45ID:8XCDXeCE
初心者がリファレンス見てもいちいち難しい言葉で書いてあって何ができるのか意味不明
ここをどうやって乗り越えればいいんだろう
0777デフォルトの名無しさん2016/10/10(月) 05:12:43.32ID:QYgl3YHZ
>>772
seed同じにすればいいんじゃねえか?
0778デフォルトの名無しさん2016/10/10(月) 05:14:08.33ID:QYgl3YHZ
とっくに答えがサンプルプログラム付きで書いてあるとはorz
0779デフォルトの名無しさん2016/10/10(月) 05:15:43.15ID:QYgl3YHZ
>>776
わからない言葉は全部調べる。
今ではだいたいはググれば出るんだから楽なもんだ。
0780デフォルトの名無しさん2016/10/10(月) 16:51:30.34ID:d7lWr1RB
String str1 = "ab";
String str2 = str1+"c";
System.out.println("abc" == str2);

これがfalseになるのはなぜでしょうか?
1行目 = コンスタントプールに"ab"作成
2行目 = プールに"c"作成して、それを取り出してstr1とあわせてプールに"abc"作成
3行目 = "abc"はstr2としてプールに存在してるので、それと比較して true になるはずだったんですが。
+ した時点で StringBuilderでも呼ばれてstr2はヒープに配置されてるのかとも思ったんですが、

String str2 = "a"+"b"+"c";
System.out.println(str2 == "abc");

だと true になります・・・
0781デフォルトの名無しさん2016/10/10(月) 17:00:37.68ID:YyG8QWAM
>>780
下のtrueのケースはビルド時に最適化されてる
0782デフォルトの名無しさん2016/10/10(月) 17:15:41.68ID:d7lWr1RB
>>781
ありがとうございます。
文字結合時に最適化がされるのであれば、2行目の結合で最適化がされないのはなぜなんでしょうか?
0783デフォルトの名無しさん2016/10/10(月) 17:22:32.42ID:d7lWr1RB
もしかして、
ダブルコーテーションで囲んだリテラルを指定した時はプールから探す。
str1のように、リテラルでない場合は、その文字列を使って new String(str1);してるんでしょうか?
0784デフォルトの名無しさん2016/10/10(月) 18:04:46.45ID:Nj78fZza
内容が同じでも同じオブジェクトを参照しているとは限らないってだけの話だよなあ。

Stringの場合はinyern()使えば==での比較で内容が同じなら同じになるけど、そういうことしないなら同じになることを期待してはいかんよ。
特に最適化によって変わるようなのはあてにしたらダメ。
■ このスレッドは過去ログ倉庫に格納されています