1.没有被引用和没有被使用是两码事。
public List<MyConcernFriends> getConcernListByUserId(String userId) {
List<MyBlackList> myBlackLists= this.getMyBlackListByUserId(userId);
HashMap<String,Boolean> hash = new HashMap<String,Boolean>();
for (MyBlackList black : myBlackLists)
{
hash.put(black.getBlackUserId(),true);
}
BSONObject query = new BasicBSONObject();
query.put(MY_CONCERN_FRIENDS.myUserId, userId);
DBAccessAPIHelp APIHelp = new DBAccessAPIHelp();
List<String> jsonDataList = APIHelp.getJsonObjects(
DBConstant.USER_INFO_SPACE, DBConstant.MY_COCERN_FRIENDS_DATA, query);
APIHelp.freeDBConnection();
List<MyConcernFriends> list = new ArrayList<MyConcernFriends>();
for (String json : jsonDataList) {
MyConcernFriends myConcernFriends = (MyConcernFriends) JacksonUtil
.jsonToBean(json, MyConcernFriends.class);
if (hash.get(myConcernFriends.getFrUserId())==null){
list.add(myConcernFriends);
}
}
return list;
}
对这一段代码如何做出优化?
尽量的在for里面少创建对象。那么如何在for里面尽量少的创建对象呢?
但是不在这里面创建,又在哪里面创建呢?
比如,在List 里面查询出了一万条数据。那么这一万条数据for循环然后json反序列化变成java bean,最后放在list里面返回出去。如果是一万条数据性能就回很低,要创建一万个对象了
这段代码该如何优化呢?
首先,代码这种编写方式相对来说还是比较清晰的,除了查询Json数据应该封装到DAO层去,不是对性能有极端要求,不建议做过多优化。
但是如果真有必要,提供几个优化思路:
1.如果你的BlackList很大,
1.1 可以预估取出值的数量,在新建的时候可以调整capacity,甚至调整load factor,以免多次开辟内存空间;
1.2 或者创建一次就直接进行缓存,用触发式的更新机制,避免重复创建;
1.3 用TreeMap替代HashMap,可以略微提升查询性能,其实你这个场景完全可以用Set,可以略微减小内存开销;
1.4 可以把这个List的Id写入到redis或者memcached中去,这样不占用本应用的内存空间。
2.Json反序列化可以使用性能更高的类库,比如Jackson,fastjson
3.如果你获取数据的那端可以控制,可以考虑性能更高的序列化方法,比如protobuff。
4.查询结果的List如果数量可以预估,那么也可以设定初始的capacity。
感觉你自己提的想要1w个对象,却不想创建1w个对象,这感觉自我矛盾的事情,貌似是没有任何办法的。
集结各类场景实战经验,助你开发运维畅行无忧