Java开发环境JDK8创建对象优化教程

在这里插入图片描述
Java开发环境中的JDK lambda foreach 创建对象
@Async
public void asyncFullEsDoc() {
List docIdList = Arrays.asList(913,914);
if (CollectionUtil.isNotNullOrEmpty(docIdList)){
List documents = new ArrayList<>(500);
docIdList.forEach(docId ->{
QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
if (!StringUtils.isBlank(doc)){
Map<String, Object> docMap = BeanToMap.objectToMap(doc);
Document document = new Document();
document.setDocumentId(docId.toString()).setDocument(docMap);
documents.add(document);
}
}); …
}
}
分析,对象释放优化

    List<Document> documents = new ArrayList<>(500);
        Document document = new Document();
        docIdList.forEach(docId ->{
            //用于对象释放
            document.setDocumentId(null);
            document.setDocument(null);
            QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
            if (!StringUtils.isBlank(doc)){
                Map<String, Object> docMap = BeanToMap.objectToMap(doc);
                document.setDocumentId(docId.toString()).setDocument(docMap);
                documents.add(document);
            }
        });    ...
   出现的bug,最后在addList时最后一个值覆盖了前面所有值,但是foreach中对象的每个对象值都是不同的。
   分析,代码继续优化。
...
    
List<Document> documents = new ArrayList<>(500);
        Document document = null;
        for (Integer docId: docIdList) {
            document = new Document();
            QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
            if (!StringUtils.isBlank(doc)){
                Map<String, Object> docMap = BeanToMap.objectToMap(doc);
                document.setDocumentId(docId.toString()).setDocument(docMap);
                documents.add(document);
            }
        }
...
   如果我还是想用lambda foreach 创建对象
...
    List<Document> documents = new ArrayList<>(800);
        final Document[] document = new Document[1];
        docIdList.forEach(docId ->{
            QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
            if (!StringUtils.isBlank(doc)){
                Map<String, Object> docMap = BeanToMap.objectToMap(doc);
                document[0] = new Document();
                document[0].setDocumentId(docId.toString()).setDocument(docMap);
                documents.add(document[0]);
            }
        });
...

分析
Object object= new Object();
写在100个循环内等于你有100个引用对应了100个对象,所以100个对象在一段时间都占用内存,知道内存不足GC主动回收。
object = new Object();
写在100个循环内等于你使用1个引用分别100次调用了100个对象,所以当后一个对象init后,前一个对象已经是“无引用状态”,会很快的被GC自动回收(在你的循环还没结束时,可能已经进行了多次GC回收,这点重要)
文章来自:https://www.itjmd.com/news/show-5347.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值