for循環中ArrayLis嵌套用ArrayList的一些坑

在寫項目時遇到從數據庫取出一堆關於評論的信息,在Service層中進行數據處理,最終想以List<List<Map<>>>>形式進行解析交互。

先看我正確的代碼,之後在放出遇到的坑,


package com.platebbg.product.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.platebbg.product.dao.CommentProductDao;
import com.platebbg.product.dao.dto.ProductComment;
import com.platebbg.product.service.CommentProductService;
@Service
public class CommentProductServiceImpl implements CommentProductService{
	@Autowired
	private CommentProductDao commentProductDao;
	@Override
	public List< List<Map<String, Object>>> commentproductInfo(int plateId) {
		List< List<Map<String, Object>>> result=new ArrayList<>();
		List<Map<String, Object>> resultlist=new ArrayList<>();
		List<ProductComment> commentlist=commentProductDao.getCommentByplateId(plateId);
		int temp=commentlist.get(0).getCommentid();
		for(int i=0;i<commentlist.size();i++){
			ProductComment productcomment =commentlist.get(i);
			Map<String,Object> productresult=new HashMap<>();
			Integer commentId=productcomment.getCommentid();
			System.out.println(commentId);
			System.out.println(temp);
			if(commentId==temp){
				System.out.println("11111111111");
				productresult.put("commentId", commentId);
				productresult.put("commentlevel", productcomment.getCommentlevel());
				productresult.put("commenttitle", productcomment.getCommenttitle());
				productresult.put("commentuser", productcomment.getCommentuser());
				productresult.put("commentphone", productcomment.getCommentphone());
				productresult.put("commenttime", productcomment.getCommenttime());
				productresult.put("comsubId",productcomment.getComsubid());
				productresult.put("comsubcontent", productcomment.getComsubcontent());
				productresult.put("comsubimg", productcomment.getComsubimg());
				productresult.put("comsubuser",productcomment.getComsubuser() );
				productresult.put("comsubphone", productcomment.getComsubphone());
				productresult.put("comsubtime", productcomment.getComsubtime());
				resultlist.add(productresult);	
							
			}
			else{
				System.out.println("222222222222");
				result.add(resultlist);
				resultlist=new ArrayList<>();
				productresult.put("commentId", commentId);
				productresult.put("commentlevel", productcomment.getCommentlevel());
				productresult.put("commenttitle", productcomment.getCommenttitle());
				productresult.put("commentuser", productcomment.getCommentuser());
				productresult.put("commentphone", productcomment.getCommentphone());
				productresult.put("commenttime", productcomment.getCommenttime());
				productresult.put("comsubId",productcomment.getComsubid());
				productresult.put("comsubcontent", productcomment.getComsubcontent());
				productresult.put("comsubimg", productcomment.getComsubimg());
				productresult.put("comsubuser",productcomment.getComsubuser() );
				productresult.put("comsubphone", productcomment.getComsubphone());
				productresult.put("comsubtime", productcomment.getComsubtime());
				resultlist.add(productresult);
				temp=commentId;
			}
			
		}
		result.add(resultlist);	
		return result;
	}

}



不知大家主要到沒有,我這使用的

resultlist=new ArrayList<>();
是重新new一個對象,在之前我想着不要重複創建新對象,便使用了

resultlist.clear();

來進行清除處理,但是傳到頁面上的數據會都是一樣的數據,我反覆測驗,表示在傳到Service層的數據沒有錯誤,

之後終於發現list裏面放的是同一個對象map的堆地址,指向的都是同一個對象

所以就算你clear之後,你之前的result.add中存放進去的ArrayList的對象地址並沒有改變,就是說你clear之後在放進去值,之前已經放入result中的ArrayList也會跟着改變,
最後之後變成都是最後改變的resultlist的值。


這是我在開發評論模塊中遇到的問題,不喜勿噴。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章