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

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

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

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

Q&A

解決済

1回答

591閲覧

=関係が成り立たない

Jhon_McClane

総合スコア48

Java

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

0グッド

0クリップ

投稿2020/05/18 12:31

前提・実現したいこと

arraylistにいくつかの長方形データがarrRに格納してある。(width,height,x,y)
新たな長方形を作る際に入力したものと配列に入ってあるものを比較し、
すでに存在するならばtrue; 存在しないならばfalseを返すメソッドを作っています。
しかし実行すると以下のように==の機能が成り立つ場合と立たない場合があり
原因がわかりません。
すでにデータとして以下のものがあった場合
R0は幅:100,高さ:234,x座標:123,y座標:134

新しく入力値を幅:100,高さ:234,x座標:123,y座標:134とすると
100 = 100
234 != 234
100 != 100
となります

なおSystem.out.printlnはどのように動いているのかを調べるため書きました

該当のソースコード

boolean isRepeat(Integer width, Integer height, Integer x, Integer y){ for (int i=0;i<arrR.size() ;i++ ) { System.out.println(i+"番目"); if (width == arrR.get(i).getRWidth()) { System.out.println(width + " = " + arrR.get(i).getRWidth()); if (height == arrR.get(i).getRHeight()) { System.out.println(height + " = " + arrR.get(i).getRHeight()); if (x == arrR.get(i).getRX() ) { System.out.println(x + " = " + arrR.get(i).getRX()); if (y == arrR.get(i).getRY()) { System.out.println(y + " = " + arrR.get(i).getRY()); return true; } System.out.println(y + " != " + arrR.get(i).getRY()); } System.out.println(x + " != " + arrR.get(i).getRX()); } System.out.println(height + " != " + arrR.get(i).getRHeight()); } System.out.println(width + " != " + arrR.get(i).getRWidth()); } return false; }
public Integer getRWidth(){ return this.rWidth; } public Integer getRHeight(){ return this.rHeight; } public Integer getRX(){ return this.rX; } public Integer getRY(){ return this.rY; }

試したこと

System.out.printlnをいれてどこがおかしいのか調べたが
=が成り立っていないことがわかった。

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

javac 1.8.0_252

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

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

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

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

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

guest

回答1

0

自己解決

==ではなくequalsを使って解決しました。
https://qiita.com/hysdsk/items/1251e86d9d22507d309aのサイトに書いてありました。
.equalsメソッドはStringだけしか使えないものだと思い込んでいたがIntegerでも使えることがわかりました。
参照型に"==演算子"比較をすると、変数が保持する参照アドレスの比較を行い同一のインスタンスかどうかを判定するということも学びました。

投稿2020/05/18 12:47

編集2020/05/18 12:50
Jhon_McClane

総合スコア48

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

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

LouiS0616

2020/05/18 12:49

質問のソースを見る限り、Integerじゃなくてintを使えば良いんじゃないかなと思います。Integerを使っている理由が何かあるのでしょうか。 > .equalsメソッドはStringだけしか使えないものだと思い込んでいたがIntegerでも使えることがわかりました。 Objectのメソッドです。つまり参照型の全てのクラスで使えます。
Jhon_McClane

2020/05/18 12:52

intで書こうと思ったのですが学校で配られたクラスのフィールドがInteger使用になっていたためIntegerをつかいました
LouiS0616

2020/05/18 12:54

なるほど。ちょっと謎ですね。 Integerは一部がキャッシュされているので、==で比較に成功してしまうこともあります。案外見落としがちなので注意です。
Jhon_McClane

2020/05/18 12:58

なるほど。勉強になりました。ありがとうございます。 つまり同じアドレスが使われるケースがあるということであっていますか?
LouiS0616

2020/05/18 13:04

基本的には -127 から 128 の値は同じインスタンスが使いまわされます。
Jhon_McClane

2020/05/18 13:10

LouiS0616さんありがとうございます。 Integerの理解が深まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問