1

私はジェネリックが初めてで、私の質問への答えがopinion based本物の理由であるかどうかわかりません. 次のコードでは、エントリのキーをオブジェクトにケース化するために何が必要でしたか?

Object k;
if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))

簡単に交換できそうです

if (e.hash == hash && (e.key == key || (key != null && key.equals(e.key))))

より多くの参照:

 final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key);
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }
4

4 に答える 4

3

これは極端な最適化手段であり、汎用プログラミングの実践にはおそらく必要ありません。これがあなたの質問に答えることができる議論です。以下のステートメントは、その投稿からコピーされます。

Doug Lea によって普及したコーディング スタイルです。これは極端な最適化ですが、おそらく必要ありません。JIT が同じ最適化を行うことが期待できます。(自分でマシン コードをチェックしてみてください!) それでも、ローカルにコピーすると最小のバイトコードが生成されます。低レベル コードの場合は、少しマシンに近いコードを書くとよいでしょう。

于 2013-10-16T05:42:09.120 に答える
0

Entry のコードを見ると、key は「final」です。私の見解では、このコードは final 変数から非 final 変数を作成しているため、final 変数の制約によって後続のコードの実行が妨げられないようになっています。それ以外は、あなたが言ったように、両方の「if」条件は同じでなければならないと思います。

于 2013-10-16T05:03:23.173 に答える
0

keywhereが と等しいかどうかがチェックされる最後の部分を見逃しているkため、代入を削除する(k = e.key)と最後のチェックが壊れます -

if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))

于 2013-10-16T04:18:10.237 に答える
0

クラスでやりたいことがフープをジャンプする必要がある場合は、そうします。ジェネリックでは、常に意味をなすのに苦労しました。思ったより簡単にできることもあれば、思いつく限りのことを試してみることもあります。それを守ってください。

于 2013-10-16T04:29:15.720 に答える