原文地址:Spring JdbcTemplate 查詢出的Map,是如何產生大小寫忽略的Key的?
原始討論組:用Spring JdbcTemplate 查詢出的Map,是如何產生大小寫忽略的Key的?
Java 是區分大小寫的,普通的Map例如HashMap如果其中的key="ABC" value="XXX"
那么map.get("Abc") 或 map.get("abc")是獲取不到值得。
但Spring中產生了一個忽略大小寫的map使我產生了好奇
例如 jdbcTemplate.queryForList(sql)產生的 List<Map>
key="BID" value="STR1"
其中key都是大寫的
但如果用
System.out.println("map.get(BILLIDS):" + map.get("BID") );
System.out.println("map.get(billids):" + map.get("bid") );
System.out.println("map.get(bIlLIds):" + map.get("bId") );
都可以查出=STR1
請問這是怎么做到的?
Spring用的是自己封裝的Map:org.springframework.util.LinkedCaseInsensitiveMap,基於java.util.LinkedHashMap封裝的。
LinkedCaseInsensitiveMap有一個成員變量Map caseInsensitiveKeys,小寫后的Key與真實key的映射關系,get的時候先把你傳入的key轉小寫得到真實的KEY,然后得到對應value,所以大小寫不敏感了。
但其實key還保持本色的,所以如果序列化為json或者xml格式,key是大寫,這是需要注意的。
public Object put(String key, Object value)
{
caseInsensitiveKeys.put(convertKey(key), key);
return super.put(key, value);
}
public Object get(Object key)
{
if(key instanceof String)
return super.get(caseInsensitiveKeys.get(convertKey((String)key)));
else
return null;
}