Map<String, String> listOfIndexes = INDEXED_TABLES.get(tableName);
Iterator it = listOfIndexes.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
System.out.println(pairs.getKey());
}
我的哈希图是这样的:
public static Map<String, Map<String, String>> INDEXED_TABLES = new HashMap<String, Map<String, String>>()
{{
put("employee", EMPLOYEE);
}};
public static Map<String, String> EMPLOYEE = new HashMap<String, String>()
{{
put("name", "Test");
put("age", "Test");
put("sex", "test");
}};
这是因为你比自己聪明:你的初始值设定项取决于执行顺序。在此行运行时
put("employee", EMPLOYEE);
EMPLOYEE
仍然null
,所以这就是放入您Map<String,Map<String,String>>
的内容。
您可以切换初始值设定项的顺序来解决此问题。但是,最好将初始化代码放入单独的初始值设定项中,而不是将匿名类与自定义初始值设定项一起使用:
public static Map<String, Map<String, String>> INDEXED_TABLES = new HashMap<String, Map<String, String>>();
public static Map<String, String> EMPLOYEE = new HashMap<String, String>();
static {
EMPLOYEE.put("name", "Test");
EMPLOYEE.put("age", "Test");
EMPLOYEE.put("sex", "test");
INDEXED_TABLES.put("employee", EMPLOYEE);
}
看起来你在初始化之前就将 EMPLOYEE 放到地图中,所以它将被null
(并且保持如此,即使您稍后将某些内容分配给 EMPLOYEE(。
颠倒两个语句的顺序。
或者,虽然总的来说我不赞成双括号初始值设定项(希望我们能在 Java 8 中获得正确的集合文字(:
public static Map<String, Map<String, String>> INDEXED_TABLES =
new HashMap<String, Map<String, String>>(){{
put("employee", new HashMap<String, String>(){{
put("name", "Test");
put("age", "Test");
put("sex", "test");
}}
}}