I need to get one data from a collection (get() calls in the range of 100K for a single file processing).
public class DemoCollection {
private Map<GroupCriteria, GroupData> collectionHolder = new ConcurrentHashMap<GroupCriteria, GroupData>();
/**
*
* @param groupCriteria
* GroupCriteria
* @return GroupData
*/
public GroupData getGroupForGroupingCriteriaOne(GroupCriteria groupCriteria) {
GroupData groupData = null;
if (collectionHolder.containsKey(groupCriteria)) {
groupData = collectionHolder.get(groupCriteria);
} else {
// Get from database
}
return groupData;
}
/**
*
* @param groupCriteria
* GroupCriteria
* @return GroupData
*/
public GroupData getGroupForGroupingCriteriaTwo(GroupCriteria groupCriteria) {
GroupData groupData = null;
if ((groupData = collectionHolder.get(groupCriteria)) == null) {
// GEt from database
}
return groupData;
}
}
Which is the best practice in this regard ? The approach one (getGroupForGroupingCriteriaOne) , two (getGroupForGroupingCriteriaTwo) or neither ?
Usually I ignore these premature optimization things, but since the get() calls are too huge I’m little bothered.
Could you please advice ?
Consider using Guava’s MapMaker:
This
ConcurrentMapwill handle all concurrent requests for you. See theMapMakerdocumentation for a list of all configurable features of the produced map.