不同業務場景使用不同的map

jia635發表於2014-06-27


   System.out.println("Map當Key一樣,後面的value會覆蓋前面的value");
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 2);
map.put(1, 3);
System.out.println(map.get(1));    // 3
System.out.println(map.keySet());   //[1]
System.out.println(map.containsValue(2));   //false
System.out.println(map.containsKey(1));   //true

System.out.println("------------------------------");

System.out.println("MultiValueMap 當Key一樣,value不一樣,不會覆蓋");
MultiValueMap map2 = new MultiValueMap();
map2.put(1, 2);
map2.put(1, 3);
System.out.println(map2.get(1));    // [2,3]
System.out.println(map2.keySet());  //[1]
System.out.println(map2.containsValue(2));  //true

System.out.println(map2.containsKey(1));  //true


該程式是一個單執行緒時間排程程式。
用途:每臺機器需要定時執行的程式。比如: 更新本地快取,更新索引檔案,定時資料分析計算,定時發郵件,旺旺等等。
說明:1,需要考慮定時執行的任務在設定時間內是否能順利完成,否則容易積壓任務。
         2,需要考慮本地快取的資料結構的讀寫同步


private static Map configMap = new ConcurrentHashMap(20);
private ScheduledExecutorService scheduledExecutorService;


public void init() {
reloadCache();
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
// 每隔10分鐘自動更新一次
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
reloadCache();
}
}, 1, 10, TimeUnit.MINUTES);
}


private void reloadCache() {
// 需要定時排程的任務,比如: 可以更新本類的靜態MAP 等等。
}


 將一個普通java物件轉換成Map. 一般我們會通過Class物件的getFields()來獲取所有屬性,然後通過遍歷所有屬性生成Getter的方法名,通過呼叫getDeclaredMethod()來獲取getter方法,然後invork()得到屬性值.


反射的效率很高,但是上述獲取getter方法的代價還是比較大.高效的話需要自己對Class的getter方法做cache.
用BeanInfo的方式獲取的話,jdk內部實現自動對做過呼叫的class做了快取,所以效率更好.


public static Map<String, Object> convertBean(Object bean,
Set<String> excludeProperties) throws IntrospectionException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
Class<?> type = bean.getClass();
Map<String, Object> objMap = new HashMap<String, Object>();
BeanInfo beanInfo = Introspector.getBeanInfo(type);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
String propertyName = propertyDescriptor.getName();
if (!"class".equals(propertyName)) {


Method readMethod = propertyDescriptor.getReadMethod();


Object result = readMethod.invoke(bean, new Object[0]);


objMap.put(propertyName, result != null
&& result.getClass().isEnum() ? result.toString()
: result);
}
}
return objMap;
}

相關文章