1

こんにちは、通常の配列を使用して 2 つのキー値を格納することでオブジェクトの作成を回避しようとしていますが、うまくいかないようです。

その 1 つのオブジェクトの作成を回避するための解決策があることを知っているかもしれません。

追加するのを忘れた:

1) うまくいかない理由はわかっています... そうしないと、キーに equals() と hashcode() を実装しません。

2)基本的に、キーを取得するときに1つのオブジェクトの作成を回避しようとしています。通常、サービスクラスにはメソッドがあります

public void get(String key1, String key2){
       return keyMap.get(new Key(key1,key2)); <>>avoiding the new Key()
}

改行

import java.util.HashMap;
import java.util.Map;


public class ArrayMap {

    /**
     * @param args
     */
    public static void main(String[] args) {

        /*start A  Possible to get this to work? */
        Map<String[], String> arrMap = new HashMap<>();
        arrMap.put(new String[] { "hello", "hi" }, "hello motto");
        System.out.println(arrMap);
        System.out.println(arrMap.get(new String[] { "hello", "hi" })); // print
                                                                        // null
         /* end of A */

        /*Start of B: Reason: to avoid this */
        Map<Key, String> keyMap = new HashMap<Key, String>();
        keyMap.put(new Key("hello", "hi"), "hello motto"); // I wish to avoid one object creation 

        System.out.println(keyMap.get(new Key("hello", "hi"))); // print
                                                                // "hello motto"
        /*End of B: Reason: to avoid this */
    }
}

class Key {
    private final String key1;
    private final String key2;

    public Key(String key1, String key2) {
        this.key1 = key1;
        this.key2 = key2;
    }

    public String getKey1() {
        return key1;
    }

    public String getKey2() {
        return key2;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((key1 == null) ? 0 : key1.hashCode());
        result = prime * result + ((key2 == null) ? 0 : key2.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Key other = (Key) obj;
        if (key1 == null) {
            if (other.key1 != null)
                return false;
        } else if (!key1.equals(other.key1))
            return false;
        if (key2 == null) {
            if (other.key2 != null)
                return false;
        } else if (!key2.equals(other.key2))
            return false;
        return true;
    }
}
4

4 に答える 4

4

このアプローチにはいくつかの問題があります。

equals()1.配列の/hashcode()メソッドをオーバーライドすることはできません-これは、HashMapが正しいキーを検索したかどうかを正しく判断できないため、問題になります。

2.キーを作成するたびに、新しいオブジェクトを作成しています。配列はオブジェクトです-毎回新しい配列を作成することで何も節約できません。元のKeyオブジェクトを使用することもできます。

考えられる解決策

したがって、毎回新しいオブジェクトを作成することを避けたい理由は、get(key)そのHashMapLOTを呼び出すためであると想定します。その場合は、オブジェクトKeyの内部に残る可変インスタンスを作成してみませんか。ArrayMap2つのをキー入力するたびにString、それらを可変Keyインスタンスに設定し、その可変インスタンスをルックアップに使用します。Keyそうすれば、のペアの値を検索するたびに新しいものを作成する必要はありませんStrings

于 2013-03-13T14:54:39.777 に答える
2

これらの行で

arrMap.put(new String[] { "hello", "hi" }, "hello motto");
System.out.println(arrMap);
System.out.println(arrMap.get(new String[] { "hello", "hi" })); // print
                                                                    // null

a をキーとして使用しString[]ます。そのオブジェクトには、内容を比較できるクラスequals()のようなカスタム メソッドがありません。そのため、新しいものをKey渡そうとすると(ただし内容は同じ)、同じオブジェクトではないため、何も見つかりません。map.get()String[]

あなたがやりたいことはこれです

String[] array = new String[] { "hello", "hi" };
arrMap.put(array , "hello motto");
System.out.println(arrMap);
System.out.println(arrMap.get(array)); // print hello motto

配列型をマップのキーとして使用しないでください。

于 2013-03-13T14:53:06.807 に答える
2

その 1 つのオブジェクトの作成を回避するための解決策があることを知っているかもしれません。

頑張りすぎているかどうかわからない場合は、おそらくそうです。提供された情報に基づくと、これは時期尚早の最適化のようです。

関連するいくつかのポイント:

  1. オブジェクトの作成は、特にオブジェクトの有効期間が短い場合、コストがかかりません。
  2. ソフトウェアのパフォーマンス特性を確認する唯一の方法は、プロファイルを作成することです。
于 2013-03-13T14:56:41.663 に答える
1

javaでは、array1.equals(array2)は、array1 == array2の場合のみです。つまり、これらはメモリ内のまったく同じインスタンスです。そのため、マップはそれらを別々のキーとして表示します。マップのキーのKeyクラスを使用することをお勧めします

于 2013-03-13T14:55:17.143 に答える