JAVA代码如何优化?

1.没有被引用和没有被使用是两码事。

java
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里面返回出去。如果是一万条数据性能就回很低,要创建一万个对象了
这段代码该如何优化呢?

阅读 3.8k
1 个回答

首先,代码这种编写方式相对来说还是比较清晰的,除了查询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个对象,这感觉自我矛盾的事情,貌似是没有任何办法的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题