- 締切済み
Javaのハッシュコードについて
SunJava2認定ガイドでJavaを勉強している初心者ですが、「オブジェクトとコレクション」を説明した章(第7章)に、 ・2つのオブジェクトがequals()メソッドで等しいと判定された場合、 両者のハッシュコード値は同じでなければならない ・2つのオブジェクトを等しいと見なすためには、両者のハッシュコー ドも等しくなければならない という記述がありますが、この2つのオブジェクトのハッシュコードというのは2つのオブジェクトを指すそれぞれの参照変数であると理解していいのでしょうか? … もしそうであるなら、2つのオブジェクトが等しいという意味は、2つのオブジェクトは同一であるということを意味することになるのでしょうか どなたかご教示ください
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
- sakusaker7
- ベストアンサー率62% (800/1280)
関連するQ&A
- 『独習JAVA』が難しい
『独習JAVA』が難しいと感じるのですが。 私は初心者ですが、カタカナ語が多くて。。 JAVAに向いていないだけなのか、この本が 難しいのかよくわかりません。どうなのでしょう? ついでに質問です~。 独JAVAの2章の2・1「メソッドの構造」を どなたか解説していただけないでしょうか?? 読んでも全く意味が分かりません。どこが? ときかれても「どこも」わかりません泣。 戻り値?メソッド? ??? といった感じです。1章も分からなかったけど 何とか読みました。メソッドのところは何も 分からず先に進めません。。。よろしくおねがい します。。。
- ベストアンサー
- Java
- javaのメソッド呼び出し
javaで質問があります。メソッドを呼び出すとき、 クラス.メソッド(引数)だと思いますが、 「.」が2つあるものがあります。 どういったものでしょうか? あるプログラムに Code.PerComFlag.ReCom.equals(atmlogDTO.getatmComFlg()) のがありました。 また、javaの本に System.out.println(・・・) という記述もあります。 よろしくお願いします。
- ベストアンサー
- Java
- 配列の型判定の仕方
メソッドの引数をObjectにして、その引数の型を判定しようとしています。 たとえば以下のような感じです。 String hoge(Object para) { if(para.equals(java.lang.Integer.class)) { return "intです"; } return "わかりません" } 上記は、int型なら判定できるメソッドですが、int[]やString[]を判定するためにはどうしたらよいのでしょうか? paraにint[]型の値が入ってきた場合、 para.equals(java.lang.Integer[].class) としてもtrueにはなりませんでした。 どうすればできるのか、ご教授いただけると幸いです。 手段がなければ、para.getClass().toString()をして出力される文字列で判定しようかと思っています。
- ベストアンサー
- Java
- Javaのソースコードを教えてください!
Javaのソースコードを教えて欲しいです コンソールに表示して3×3の○×ゲームを作ります 条件は ・メソッドを必ず使う ・〇✕ゲームをJavaのコンソール(println()やprint())を用いて作成 ・○×を書く場所は、数値を入力して対応した場所に〇や✕を出力 ・勝利判定などゲームができる所までは作成しない ・見た目なので、「この数値はここに書く というようなナビゲーション」、「実際に入力しした後の盤面」は実装するとこ ・9回入力したらゲーム終了 です
- 締切済み
- Java
- オブジェクトの参照およびハッシュコードについて
下記のプログラムは任意のクラスMoofおよびStringクラスについてそれらのオブジェクトの参照値とハッシュコードをプリントし、さらにStringオブジェクトの参照値同士の比較をしています。 次の質問に対して分かりやすくご教示ください。 (1)Moofオブジェクトについては参照値そのものの値を出力しているようですが、Stringオブジェクトの場合はオブジェクトの値(abc)が出力されているのは何故ですか (2)参照値の構成は(クラス名+@+16進ハッシュコード)であり、オブジェクト(インスタンス)のあるアドレスを指し示すと聞きました。Stringオブジェクトは2つあってその値はabcで等しいのでハッシュコードも同じになっている訳ですが、もしハッシュコードがアドレスを示すとすると2つのオブジェクトに対してアドレスは1つとなりますが… (3)上の(2)に関連して参照値four、fiveに関するオブジェクトのハッシュコードはともに0x17862で等しいのですが、両者を==演算子で比較するとfalseとなります。 これはどうしてですか。 どなたか詳しい方、よろしくお願いします。 public class EqualsCheckX { public static void main(String[] args) { Moof one = new Moof(8); Moof two = new Moof(8); Moof three = one; int a = one.hashCode(); int b = two.hashCode(); int c = three.hashCode(); String four = new String("abc"); String five = new String("abc"); String six = four; int d = four.hashCode(); int e = five.hashCode(); int f = six.hashCode(); System.out.println("Moof " + " one : " + one + " two : " + two + " three : " + three); System.out.println("String" + " four : " + four + " five : " + five + " six : " + six); System.out.println(); System.out.println("hashCode" + " one : " + Integer.toHexString(a) + " two : " + Integer.toHexString(b) + " three : " + Integer.toHexString(c)); System.out.println("hashCode" + " four : " + Integer.toHexString(d) + " five : " + Integer.toHexString(e) + " six : " + Integer.toHexString(f)); System.out.println(); // String if (four == five) { System.out.println("String : four and five are equal"); } else { System.out.println("String : four and five are not equal"); } if (four == six) { System.out.println("String : four and six are equal"); } else { System.out.println("String : four and six are not equal"); } } } class Moof { private int moofValue; Moof(int val) { moofValue = val; } } C:\MyJava>java EqualsCheckX Moof one : Moof@1ac04e8 two : Moof@765291 three : Moof@1ac04e8 String four : abc five : abc six : abc hashCode one : 1ac04e8 two : 765291 three : 1ac04e8 hashCode four : 17862 five : 17862 six : 17862 String : four and five are not equal String : four and six are equal
- 締切済み
- Java
- Javaの初期化メソッドについて
こんにちは。Javaの初心者です。 Javaの初期化メソッド(initメソッド)についてなのですが、処理を記述しても実行してくれません。 恐らく使い方が間違ってるかと思われるのですが、ネットで調べてもあまり検索結果がでてこなかったので、質問させてもらいました。 以下サンプルコード import java.lang.*; public class Test { static int a; public void init() { a = 10; } public static void main(String[] args) { System.out.println(a); } } 実行してみても、「0」と表示されるだけで、「10」と表示してくれませんでした。 どこかコードが間違えてるのでしょうか? それとも初期化メソッドはアプレット用であってアプレットで使わないと意味がないというものなのでしょうか? 因みに関係ないかと思われますが、グローバル変数は自動的に初期化される(0が代入される)ということは知っています。 ご教授の方、よろしくお願い致します。
- ベストアンサー
- Java
- Javaの多態性について質問です
Java初心者です。どなたかお力をお貸しください。 ------------------- class Animal { public void eat() { // 汎用的なコード } } class Dog extends Animal { public void eat() { // 特化したコード } public void bite() { // Dog特有のコード } } ------------------- 上記のクラスについて質問があります。 Animal obj = new Dog(); obj.bite(); このコードがコンパイルエラーになるのは何故でしょうか? コンパイラが参照型のみをチェックし、Animalクラスにbiteメソッドが 無いため、エラーを出すと参考書に書いてありました。 つまり、スーパークラス型の参照変数にサブクラスのインスタンスを格納し、 サブクラス特有のメソッドをコールできないとはどういう意図なんでしょうか? コンパイラのチェックで引っかかるのは分かったのですが、 オブジェクト指向としては、この使い方は推奨されないということでしょうか? (Animalの参照で、Dog特有のメソッドは使わない?) 実際にJavaでプログラムを組むときには、こんな使い方をしないのですか? 有知識者の方、教えて下さい。 私は、オブジェクト指向の多態性の理解が甘いため、こんな質問をしているのだと 思います。申し訳ございません。
- ベストアンサー
- Java
- Javaの習得に向けたグラフィックスについて
Javaの習得に向けて学習する場合、ひとえにオブジェクトがどういう風なものなのかを習得するということが主眼になると思います。クラス,メソッド,クラスの継承とか,クラス間での変数のスコープ(これは全言語で共通の学習)とかです。ファイル入出力、ループ、分岐なども全言語共通的なので翻訳可能であり、学習の対象ですらないもののように思えます。 しかし、グラフィカル(GUIを生成して、ブラウザで見せたりする)なところになると急激に視界不良のような印象になります。長い名前のコマンドでイベントリスナーとかフレームとかのオブジェクトとかラジオボタンをペタペタ貼り付けるとかです。それらのグラフィックスの機能というのは、Java独特のクラスとかオブジェクトの学習と関連しているのかどうかわかりにくくなる印象を持ちます。Javaの学習とあのグラフィックスは切り離して考えるのか、それともJavaの学習の結果その応用としてグラフィックス関係の処理が出てくるのか不明な感じになります。もし後者なら学習した内容に照らし合わせた機能と考えて納得させる必要がありますが、前者ならあんまり気にしないでブラックボックスとして処理するということになりそうです。Javaのグラフィックスはどのように理解して学習すればいいのでしょうか。 例えばVisual BasicなどはオブジェクトをGUI的に作ってウィンドウ上に貼り付けてその機能をコード化するということになるので、もう少しわかりやすいというか整理して(分業というか)して処理できそうですが、Javaは全部コード化するので理解しにくい印象があります。たとえばコードがあってその横にグラフィックスが示されているなら、もう少しマシなのですが。Javaの入門書では全くグラフィックスに触れないものあり、それだと通読しやすいです。グラフィックスが出てくると急激に歩みが遅くなるのですが。考え方について教えて頂きたいと思います。 よろしくお願いします。
- 締切済み
- Java
- JAVAソースコードの暗号化
JAVAソースコードの暗号化 失礼致します。 カテゴリを間違えて登録してしまった為再度登録させてもらいます。 JAVAのソースコードに公開したくないロジックが含まれており、 ソースコードを暗号化したいと考えています。 もし同じようなことで悩んだ方がいらっしゃいましたら、 アドバイスいただきたいと思い書き込みします。 まず「どこまで暗号化(隠蔽)できればよいのか」という基準については、 「jadで逆コンパイルしても内部のロジックが読み取れなければよい」 と考えています。(特にディレクトリのパスが指定していますのでその部分、変数の中身等) ためしにフリーのProGuardを使用してみましたが、 クラスファイル名やメソッド名、変数名がa,b,cなどに変換されたものの、変数の中身は丸見えのままでした。 【元データの逆コンパイル】 String confFilePath = rootPath + "conf/"; String masterFile = confFilePath + subDir + "Pass.xml"; String confSubDir = confFilePath + subDir; String outputPath = rootPath + "file/" + subDir; 【ProGuardをかけて逆コンパイル】 Object obj; obj = s + "conf/"; String s2 = obj + s1 + "Pass.xml"; String s3 = obj + s1; String s4 = s + "file/" + s1; ProGuard自体、ソースコードの軽量化に使われるのが主流なようなので、仕方がないといえば仕方がないと思いますが、 どうにか読み取られないようにできないものでしょうか。 ご意見、お待ちしています。 ※次はDashOの評価版を試してみようと考えていますが、 あまりお金はかけたくないので、正規に使う見込みがありません。 ただお金をかければこんだけの暗号化はできるというのがあれば教えてもらいたいです。 何日も調べてかなり悩んでいます、、お願いします。
- ベストアンサー
- Java
お礼
お忙しいところをお付き合いいただいてありがとうございました。 ご教示いただいたことをまとめると、やはり次のようになると思えるのですが… Object クラスのequals() メソッドを使って2つのオブジェクトを 比較した結果、true が返された場合は、2つのオブジェクトは同一である。オブジェクトの実体は1つであり、その内容は等しく、さらにhashcode も当然等しくなる。… 2つの参照変数が同一のオブジェクトを指している。 オーバーライド(String クラスやラッパークラスと同じように)したequals() メソッドを定義して2つのオブジェクトを比較した結果がtrue になった場合、その内容は等しいが、一般的にそのhashcode は異なる。… この場合、hashCode() メソッドもオーバーライドしていればhashcode が等しくなるように処理してくれるんですかね? … もう一つすっきりしないので、さらに調査してみます。 sakusaker7 さんへ KuroGin より