質問編集履歴

3

2020/07/16 15:22

投稿

cosmosyuki
cosmosyuki

スコア4

test CHANGED
File without changes
test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- これについて調べていった結果、equalメソッドは、BigDecimalクラスでオーバーライドされていて、
123
+ これについて調べていった結果、equalsメソッドは、BigDecimalクラスでオーバーライドされていて、
124
124
 
125
125
  (Integerクラスや、Stringクラスでもされていました。他にもあるかもしれません)
126
126
 
@@ -186,7 +186,7 @@
186
186
 
187
187
  なので、Integerクラスにおいて、オブジェクト同士が同値であるかどうか確認したい場合は
188
188
 
189
- (Integerクラス内でオーバーライドした)equalメソッドを使う、で大丈夫だと思いました。
189
+ (Integerクラス内でオーバーライドした)equalsメソッドを使う、で大丈夫だと思いました。
190
190
 
191
191
 
192
192
 

2

文字の追加

2020/07/16 15:22

投稿

cosmosyuki
cosmosyuki

スコア4

test CHANGED
File without changes
test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  ```
102
102
 
103
- ### 皆さんのご回答をもとに、少し調べた内容
103
+ ### 【追記】皆さんのご回答をもとに、少し調べた内容
104
104
 
105
105
  まずここまで、==で比較すると、インスタンスの比較になると理解しました。
106
106
 

1

追記させて頂きます。

2020/07/16 06:38

投稿

cosmosyuki
cosmosyuki

スコア4

test CHANGED
File without changes
test CHANGED
@@ -99,3 +99,95 @@
99
99
  }
100
100
 
101
101
  ```
102
+
103
+ ### 皆さんのご回答をもとに、少し調べた内容
104
+
105
+ まずここまで、==で比較すると、インスタンスの比較になると理解しました。
106
+
107
+ System.arraycopyでは中身をコピーしたが、Integer型の配列なので、値が格納されているメモリの場所をコピーしている事になって、結果としてコピーしたものはコピー元と同じオブジェクトを指しているという事。
108
+
109
+ そして、momon-ga様が二つ目に示して頂いたコードの中のように、intでキャストして比較ができるという事。
110
+
111
+
112
+
113
+ ただ、疑問に思った事。
114
+
115
+ momon-ga様が最初に示して頂いたコードの、下から2行目の結果がfalseになる事が疑問でした。
116
+
117
+ > System.out.println(bg1.equals(bg2));  //false
118
+
119
+ System.out.println(bg1.compareTo(bg2) == 0); //true
120
+
121
+
122
+
123
+ これについて調べていった結果、equalメソッドは、BigDecimalクラスでオーバーライドされていて、
124
+
125
+ (Integerクラスや、Stringクラスでもされていました。他にもあるかもしれません)
126
+
127
+
128
+
129
+ 以下のように記述されており、上から三つ目のifのところが該当の箇所だと思われます。
130
+
131
+ スケール値が違うとfalseを返すというような。
132
+
133
+
134
+
135
+ ```java
136
+
137
+ @Override
138
+
139
+ public boolean equals(Object x) {
140
+
141
+ if (!(x instanceof BigDecimal))
142
+
143
+ return false;
144
+
145
+ BigDecimal xDec = (BigDecimal) x;
146
+
147
+ if (x == this)
148
+
149
+ return true;
150
+
151
+ if (scale != xDec.scale)
152
+
153
+ return false;
154
+
155
+ long s = this.intCompact;
156
+
157
+ long xs = xDec.intCompact;
158
+
159
+ if (s != INFLATED) {
160
+
161
+ if (xs == INFLATED)
162
+
163
+ xs = compactValFor(xDec.intVal);
164
+
165
+ return xs == s;
166
+
167
+ } else if (xs != INFLATED)
168
+
169
+ return xs == compactValFor(this.intVal);
170
+
171
+
172
+
173
+ return this.inflated().equals(xDec.inflated());
174
+
175
+ }
176
+
177
+
178
+
179
+ ```
180
+
181
+ Integerクラスも確認したところ、オブジェクト同士の確認もするが
182
+
183
+ Integerクラス同士のオブジェクトの比較の際には、中の値を比べてくれるコードが記述されていました。
184
+
185
+
186
+
187
+ なので、Integerクラスにおいて、オブジェクト同士が同値であるかどうか確認したい場合は
188
+
189
+ (Integerクラス内でオーバーライドした)equalメソッドを使う、で大丈夫だと思いました。
190
+
191
+
192
+
193
+ 長々と申し訳ありません。皆様ありがとうございました。