回答編集履歴

5

Stringについて説明更新

2022/06/08 21:58

投稿

yukihane
yukihane

スコア111

test CHANGED
@@ -20,4 +20,21 @@
20
20
  > 個別のオブジェクトに対して個別の整数を返します。
21
21
 
22
22
  が成立します。
23
+ (それ以外の場合、成立するかもしれませんが、成立しないかもしれません(そもそも"hash"の名の通り、一般的には成立しないと考えるべきです)。)
24
+
25
+ また、今回の質問の本題である `String` についていうと、成立しません。
23
- (それ以外の場合、成立するかもしれませんが、成立しないかもしれません("hash"の名の通り、一般的には成立しないと考えるべきです)。例: [`String` の `hashCode()` 実装](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/String.html#hashCode()))
26
+ [`hashCode()` APIドキュメント](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/String.html#hashCode()) を見ると分かる通り、文字列の内容から値を算出しているので、前述したアドレス相当である "オブジェクトID" が異なるものも同じ値になります。
27
+
28
+ ```java
29
+ final String str1 = "すとりんぐ1";
30
+ final String str2 = "すとりんぐ1";
31
+ final String str3 = new String("すとりんぐ1");
32
+ final String str4 = str3.intern();
33
+
34
+ assert str1 == str2;
35
+ assert str1 != str3;
36
+ assert str1 == str4;
37
+
38
+ // 異なるオブジェクトでも同じ文字列なので hashCode() 値は同一
39
+ assert str1.hashCode() == str3.hashCode();
40
+ ```

4

質問の本題である String について追記

2022/06/08 21:48

投稿

yukihane
yukihane

スコア111

test CHANGED
@@ -20,4 +20,4 @@
20
20
  > 個別のオブジェクトに対して個別の整数を返します。
21
21
 
22
22
  が成立します。
23
- (それ以外成立するかもしれないし、成立しないかもしれません。)
23
+ (それ以外の場合、成立するかもしれませんが、成立しないかもしれません("hash"の名の通り、一般的には成立しないと考えるべきです)例: [`String` の `hashCode()` 実装](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/String.html#hashCode()))

3

追記に回答

2022/06/08 21:23

投稿

yukihane
yukihane

スコア111

test CHANGED
@@ -2,3 +2,22 @@
2
2
  コード中では[オブジェクト同士の `==` や `!=`](https://docs.oracle.com/javase/specs/jls/se17/html/jls-15.html#jls-15.21.3) で評価できます。
3
3
 
4
4
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-06-08/db3dd678-cd23-4f0f-a79a-9de06055e0b3.png)
5
+
6
+ ----
7
+ > アドレスを取得する方法は存在しない。
8
+
9
+ 正しいです。
10
+
11
+ > 変数が参照しているアドレスが同じか異なっているかを確認する方法として、 hashCodeメソッドを使う方法がある。 hashCodeメソッドの戻り値は、オブジェクトのアドレスを利用して生成されるため、 インスタンスが異なれば、hashCodeメソッドの戻り値も異なる。
12
+
13
+ 間違っています。
14
+ [APIドキュメント](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/Object.html#hashCode())を参照してください。
15
+
16
+ > クラスObjectによって定義されたhashCodeメソッド
17
+
18
+ に限って
19
+
20
+ > 個別のオブジェクトに対して個別の整数を返します。
21
+
22
+ が成立します。
23
+ (それ以外は成立するかもしれないし、成立しないかもしれません。)

2

使用単語の修正

2022/06/07 19:30

投稿

yukihane
yukihane

スコア111

test CHANGED
@@ -1,4 +1,4 @@
1
- ポインタ値に相当するものはVariablesペインに表示される `id`(オブジェクトID)です(下図破線枠参照)。
1
+ アドレス値に相当するものはVariablesペインに表示される `id`(オブジェクトID)です(下図破線枠参照)。
2
2
  コード中では[オブジェクト同士の `==` や `!=`](https://docs.oracle.com/javase/specs/jls/se17/html/jls-15.html#jls-15.21.3) で評価できます。
3
3
 
4
4
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-06-08/db3dd678-cd23-4f0f-a79a-9de06055e0b3.png)

1

キャプチャ更新(intern()を含める)

2022/06/07 19:06

投稿

yukihane
yukihane

スコア111

test CHANGED
@@ -1,4 +1,4 @@
1
1
  ポインタ値に相当するものはVariablesペインに表示される `id`(オブジェクトID)です(下図破線枠参照)。
2
2
  コード中では[オブジェクト同士の `==` や `!=`](https://docs.oracle.com/javase/specs/jls/se17/html/jls-15.html#jls-15.21.3) で評価できます。
3
3
 
4
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-06-08/734d37c9-df9b-4ea0-b952-b606cf6e69f0.png)
4
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-06-08/db3dd678-cd23-4f0f-a79a-9de06055e0b3.png)