toString() と hashCode() がオーバーライドされている場合、Java でオブジェクトの「オブジェクト参照」を取得するにはどうすればよいでしょうか? 質問する

toString() と hashCode() がオーバーライドされている場合、Java でオブジェクトの「オブジェクト参照」を取得するにはどうすればよいでしょうか? 質問する

デバッグの目的で、Java でオブジェクトの「オブジェクト参照」を出力したいと思います。つまり、状況に応じてオブジェクトが同じ (または異なる) であることを確認します。

問題は、問題のクラスが別のクラスから継承されており、そのクラスが toString() と hashCode() の両方をオーバーライドして、通常は ID を返すようになっていることです。

状況例: マルチスレッド アプリケーションを実行していて、(開発中に) すべてのスレッドがリソース オブジェクトの同じインスタンスを使用しているかどうかを確認したい場合。

ベストアンサー1

あなたはそれで具体的に何をするつもりですか (何をしたいかによって、何を呼び出す必要があるかが変わります)。

hashCodeJavaDocs で定義されているように、次のように記述されています。

合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は Java™ プログラミング言語では必須ではありません。)

hashCode()したがって、メモリ内の一意のオブジェクトであるかどうかを確認するために を使用する場合、これは適切な方法ではありません。

System.identityHashCode次のことを行います。

指定されたオブジェクトのクラスが hashCode() をオーバーライドしているかどうかに関係なく、指定されたオブジェクトに対して、デフォルト メソッド hashCode() によって返されるものと同じハッシュ コードを返します。null 参照のハッシュ コードは 0 です。

これは、あなたがやっていることとしては、あなたが望んでいることのように思えますが、ライブラリの実装方法によっては、あなたがやりたいことが安全ではない可能性があります。

おすすめ記事