6

我有一个类,其中有几个数据结构,其中有一个哈希图。但我希望哈希图具有默认值,所以我需要预加载它。既然我不能在对象中使用 put 方法,我该怎么做?

class Profile
{
    HashMap closedAges = new HashMap();
    closedAges.put("19");
}

我用这个修复了它,但我必须在对象中使用一个方法。

class Profile
{   
    HashMap closedAges = loadAges();
    HashMap loadAges()
    {
        HashMap closedAges = new HashMap();

        String[] ages = {"19", "46", "54", "56", "83"};
        for (String age : ages)
        {
            closedAges.put(age, false);
        }
        return closedAges;
    }
}
4

2 回答 2

12

例如,您想在类的构造函数中执行此操作

class Example {

   Map<Integer, String> data = new HashMap<>();

   public Example() {
      data.put(1, "Hello");
      data.put(2, "World");
   }
}

或者使用 Java 奇怪的双括号初始化特性:

class Example {

   Map<Integer, String> data;

   public Example() {
        /* here the generic type parameters cannot be omitted */
        data = new HashMap<Integer, String>() {{
           put(1, "Hello");
           put(2, "World");
      }};
   }
}

最后,如果您HashMap是类的静态字段,则可以在块内执行初始化static

static {

   data.put(1, "Hello");
   ...
}

为了解决 Behes 的评论,如果您不使用 Java 7,请<>用您的类型参数填充括号,在这种情况下为<Integer, String>.

于 2012-07-05T20:55:26.393 回答
11

你可以这样做:

Map<String, String> map = new HashMap<String, String>() {{
   put("1", "one");
   put("2", "two");
   put("3", "three");
}};

这个java习语称为双括号初始化。:

第一个大括号创建了一个新的 AnonymousInnerClass,第二个大括号声明了一个实例初始化程序块,该程序块在实例化匿名内部类时运行。

于 2012-07-05T20:55:51.790 回答