现在的位置: 首页 > 综合 > 正文

实现思想list hashmap性能差别及对象引用之一

2013年12月03日 ⁄ 综合 ⁄ 共 10782字 ⁄ 字号 评论关闭

程序实现了,但是完全没理解hashmap的思想,在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键
对比实现思想list hashmap性能差别及对象引用之一与实现思想list hashmap性能差别及对象引用之二

package com.eapt.uc.portalsearch.bo;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.eapt.base.EAPTBaseBusinessObject;
import com.eapt.uc.portalsearch.form.PortalStockCondition;
import com.eapt.uc.portalsearch.form.PortalStockSearchForm;
import com.stony.core.exception.RunException;

public class PortalStockBO extends EAPTBaseBusinessObject {

 public PortalStockSearchForm form;
 
 private List results = new ArrayList();
 
 
 public PortalStockBO(PortalStockSearchForm form){
  super();
  this.form = form;
 }

 
 protected void performBusinessLogic() {
  getInvenroryReport(); 
 }

 

 protected Map getStockInfo() {
  
  PortalStockCondition condition = (PortalStockCondition)form.getCondition();
  
  String paymentcustomer = condition.getPaymentcustomer();
  
  String otime1 = condition.getOtime1();
  
  Map results = new HashMap();
  
  StringBuffer sql = new StringBuffer(1024);

  sql.append("SELECT   partno, SUM (qty) qty, SUM (bottles) bottles, SUM (gw) gw");

  sql.append(" FROM (SELECT   sil.partno, SUM (sil.stockinqty) qty,");
  
  sql.append("               SUM (sil.stockinpkqty) bottles, SUM (sil.gweight) gw");
  
  sql.append("          FROM eapt_stockinline sil, eapt_stockin si");
  
  sql.append("         WHERE sil.stockinno = si.stockinno");
  
  sql.append("           AND currentstatus = 'COM'");

  sql.append("          AND si.paymentcustomer = ?");

  sql.append("           AND stockintime < TO_DATE (?, 'YYYY-MM-DD')");
  
  sql.append("      GROUP BY sil.partno");
  
  sql.append("      UNION ALL");
  
  sql.append("      SELECT   sil.partno, -SUM (sil.stockqty) qty,");
  
  sql.append("               -SUM (sil.stockpkqty) bottles, -SUM (sil.gweight) gw");
  
  sql.append("          FROM eapt_stockoutline sil, eapt_stockout si");
  
  sql.append("        WHERE sil.stockoutno = si.stockoutno");
  
  sql.append("           AND currentstatus = 'COM'");
  

  sql.append("           AND si.paymentcustomer = ?");

  sql.append("           AND stockouttime < TO_DATE (?, 'YYYY-MM-DD')");

  sql.append("      GROUP BY sil.partno)");
    
  sql.append("  GROUP BY partno");
   
  sql.append(" HAVING SUM (qty) > 0");
  
  Connection conn = null;

  PreparedStatement pstm = null;

  ResultSet rset = null;
  try {
   conn = getSession().connection();

   pstm = conn.prepareStatement(sql.toString());
   
   System.out.println(sql.toString());

   pstm.setString(1, paymentcustomer);
   
   pstm.setString(2, otime1);
   
   pstm.setString(3, paymentcustomer);
    
   pstm.setString(4, otime1);
   
   rset = pstm.executeQuery();

   while (rset.next()) {
    
    PortalStock vo = new PortalStock();

    String partno = rset.getString(1);
    if (null == partno )
    {
     partno = "";
    }
     
    vo.setPartno(partno);
    vo.setTotalqty(rset.getBigDecimal(2));
    vo.setTotalbottles(rset.getBigDecimal(3));
    vo.setTotalweight(rset.getBigDecimal(4));

    results.put(partno,vo);
    
   }

   return results;

  } catch (Exception e) {

   e.printStackTrace();
   throw new RunException(e);

  } finally {

   try {
    if (rset != null)
     rset.close();
   } catch (SQLException e1) {
   }

   try {
    if (pstm != null)
     pstm.close();
   } catch (SQLException e1) {
   }

  }

 }
 
 
protected List getStockDetailInfo() {
  
  PortalStockCondition condition = (PortalStockCondition)form.getCondition();
  
  String paymentcustomer = condition.getPaymentcustomer();
  
  String otime1 = condition.getOtime1();
  
  String otime2 = condition.getOtime2();

  List results = new ArrayList();
  
  StringBuffer sql = new StringBuffer(1024);
  
  sql.append("  SELECT   'IN' t, si.stockintime otime, sil.partno, si.documentcode,");
  
  sql.append("   SUM (sil.stockinqty) qty, SUM (sil.stockinpkqty) bottles,");
  
  sql.append("   SUM (sil.gweight) gw");
  
  sql.append("   FROM eapt_stockinline sil, eapt_stockin si");
  
  sql.append("   WHERE sil.stockinno = si.stockinno");
  
  sql.append("        AND currentstatus = 'COM'");
  
  sql.append("    AND si.paymentcustomer = ?");
  
  sql.append("    AND stockintime >= TO_DATE (?, 'YYYY-MM-DD')");
  
  sql.append("     AND stockintime < TO_DATE (?, 'YYYY-MM-DD')");
  
  sql.append("    GROUP BY 'IN', si.stockintime, sil.partno, si.documentcode");
  
  sql.append("    UNION ALL");
  
  sql.append("    SELECT   'OUT' t, si.stockouttime otime, sil.partno, si.documentcode,");
  
  sql.append("       SUM (sil.stockqty) qty, SUM (sil.stockpkqty) bottles,");
  
  sql.append("       SUM (sil.gweight) gw");
  
  sql.append("    FROM eapt_stockoutline sil, eapt_stockout si");
  
  sql.append("   WHERE sil.stockoutno = si.stockoutno");
  
  sql.append("       AND currentstatus = 'COM'");
  
  sql.append("       AND si.paymentcustomer = ?");
  
  sql.append("          AND stockouttime >= TO_DATE (?, 'YYYY-MM-DD')");
  
  sql.append("          AND stockouttime < TO_DATE (?, 'YYYY-MM-DD')");
  
  sql.append("  GROUP BY 'OUT', si.stockouttime, sil.partno, si.documentcode");
  
  sql.append("  ORDER BY otime");
  
   Connection conn = null;

   PreparedStatement pstm = null;

   ResultSet rset = null;
   try {
    conn = getSession().connection();

    pstm = conn.prepareStatement(sql.toString());

    pstm.setString(1, paymentcustomer);
    
    pstm.setString(2, otime1);
    
    pstm.setString(3, otime2);
    
    pstm.setString(4, paymentcustomer);
    
    pstm.setString(5, otime1);
    
    pstm.setString(6, otime2);
    
    rset = pstm.executeQuery();
    

    while (rset.next()) {

     PortalStock vo = new PortalStock();
     
     String status = rset.getString(1);
     
     String partno = rset.getString(3);
     
     if (null == partno )
     {
      partno = "";
     }
          
     vo.setStatus(status);
     vo.setOtime(rset.getDate(2));
     vo.setPartno(partno);
     
     if("IN".equals(status)){
      vo.setRecivecode(rset.getString(4));
      vo.setReciveqty(rset.getBigDecimal(5));
      vo.setRecivebottles(rset.getBigDecimal(6));
      vo.setReciveweight(rset.getBigDecimal(7));
       
     }else{
      vo.setDelivercode(rset.getString(4));
      vo.setDeliverqty(rset.getBigDecimal(5));
      vo.setDeliverbottles(rset.getBigDecimal(6));
      vo.setDeliverweight(rset.getBigDecimal(7));
     }
     
     results.add(vo);  
    }

    return results;

   } catch (Exception e) {

    e.printStackTrace();
    throw new RunException(e);

   } finally {

    try {
     if (rset != null)
      rset.close();
    } catch (SQLException e1) {
    }

    try {
     if (pstm != null)
      pstm.close();
    } catch (SQLException e1) {
    }

   }

  }

  public List getInvenroryReport(){
   if(null == form){
    return null;
   }
   Map map = getStockInfo();
   System.out.println("map==>" + map.size());
   List list = getStockDetailInfo();
   System.out.println("list==>" + list.size());
   System.out.println(list.size());
   results = getData(map,list);
   System.out.println("results==>" + results.size());
   return results;
  }
  
  
  public List getData(Map map,List list){
   
   Iterator it1=list.iterator();
   
   
   while(it1.hasNext())
   {
    PortalStock portalStock1 = (PortalStock)it1.next();
    
    Iterator it2=map.keySet().iterator();
    Iterator it3=map.values().iterator();
    PortalStock portalStock=new PortalStock();
    boolean isHasSamePartno = false;
    while(it2.hasNext()){
     String Partno = (String)it2.next();
     PortalStock portalStock2 = (PortalStock)it3.next();
     
     if(portalStock1.getPartno().equals(Partno))这里用isHasSamePartno来判断在hashmap是否存在跟list一样的对象
     {
      
      BigDecimal qty = portalStock2.getTotalqty();
      BigDecimal bottles = portalStock2.getTotalbottles();
      BigDecimal weight = portalStock2.getTotalweight();
      
      BigDecimal reciverqty = portalStock1.getReciveqty();
      BigDecimal reciverbottles = portalStock1.getRecivebottles();
      BigDecimal reciverweight = portalStock1.getReciveweight();
      
      BigDecimal deliverqty = portalStock1.getDeliverqty();
      BigDecimal deliverbottles = portalStock1.getDeliverbottles();
      BigDecimal deliverweight = portalStock1.getDeliverweight();

      
      if("IN".equals(portalStock1.getStatus()))
      {
       
       portalStock1.setTotalqty(qty.add(reciverqty));
       portalStock1.setTotalbottles(bottles.add(reciverbottles));
       portalStock1.setTotalweight(weight.add(reciverweight)); 
       portalStock2.setTotalqty(qty.add(reciverqty));
       portalStock2.setTotalbottles(bottles.add(reciverbottles));
       portalStock2.setTotalweight(weight.add(reciverweight)); 
       
      }else if("OUT".equals(portalStock1.getStatus())){
       portalStock1.setTotalqty(qty.subtract(deliverqty));
       portalStock1.setTotalbottles(bottles.subtract(deliverbottles));
       portalStock1.setTotalweight(weight.subtract(deliverweight));
       portalStock2.setTotalqty(qty.subtract(deliverqty));
       portalStock2.setTotalbottles(bottles.subtract(deliverbottles));
       portalStock2.setTotalweight(weight.subtract(deliverweight));
       
      }
      
      isHasSamePartno = true;
      break;
     }
    }
    if(!isHasSamePartno){//这里用isHasSamePartno来判断在hashmap是否存在跟list一样的对象
     
     BigDecimal zero = new BigDecimal(0);
     String status = portalStock1.getStatus();
     BigDecimal reciverqty = portalStock1.getReciveqty();
     BigDecimal reciverbottles = portalStock1.getRecivebottles();
     BigDecimal reciverweight = portalStock1.getReciveweight();
     
     BigDecimal deliverqty = portalStock1.getDeliverqty();
     BigDecimal deliverbottles = portalStock1.getDeliverbottles();
     BigDecimal deliverweight = portalStock1.getDeliverweight();
     
     if("IN".equals(status))
     {
      portalStock1.setTotalqty(zero.add(reciverqty));
      portalStock1.setTotalbottles(zero.add(reciverbottles));
      portalStock1.setTotalweight(zero.add(reciverweight)); 
     //这里使用了另一个对象,否则就会出现List Hashmap引用同一个对象这样就会导致错误
      portalStock.setTotalqty(portalStock1.getTotalqty());
      portalStock.setTotalbottles(portalStock1.getTotalbottles());
      portalStock.setTotalweight(portalStock1.getTotalweight());
     }else if("OUT".equals(status)){
      portalStock1.setTotalqty(zero.subtract(deliverqty));
      portalStock1.setTotalbottles(zero.subtract(deliverbottles));
      portalStock1.setTotalweight(zero.subtract(deliverweight));
      
      //这里使用了另一个对象,否则就会出现List Hashmap引用同一个对象这样就会导致错误
      portalStock.setTotalqty(portalStock1.getTotalqty());
      portalStock.setTotalbottles(portalStock1.getTotalbottles());
      portalStock.setTotalweight(portalStock1.getTotalweight());

     }
     
     map.put(portalStock1.getPartno(), portalStock);
    }
     
   }
   
   return list;
  }
 
 

 public static void main(String[] args) {
  
//  PortalStockBO psbo = new PortalStockBO();
//  PortalStockSearchForm form = new PortalStockSearchForm();
//  PortalStockCondition condition = new PortalStockCondition();
//  condition.setPaymentcustomer("325399");
//  condition.setOtime1("2006-1-1");
//  condition.setOtime2("2007-5-1");
//  form.setCondition(condition);
//  psbo.process1(form);
//  List list = psbo.process1(form);
//  psbo.execute();
//  System.out.print(list.size());

  
  
  
  
 }

 public List getResults() {
  return results;
 }

 

}

抱歉!评论已关闭.