Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 384|回复: 0

[Java基础知识]克隆一例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 05:53:31 | 显示全部楼层 |阅读模式
    在一般的开发过程中,往往要遇到从数据库中取出数据组成值对象(通常叫做VO),然后放在列表集中,并传回调用端的情况。在还没有接触到clone的时候,程序往往要在while块中构造VO实例,但这样做并不推荐,甚至应该极力避免,因为会造成程序效率的低下。在使用clone技术以后,程序运行效率有所改善,以下是常用写法,希望对大家有所帮助。 支持clone的VO看起来像这样: package com.XXX; import java.util.*; public class TempJob implements Cloneable { //声明其可被clone
      
       
       
         
       

       
       
      
       private String Jbnr=null;
       private String Jbdw=null;     public Object clone() {
           try {
               return super.clone();                               //返回clone以后的对象
               }
               catch (CloneNotSupportedException e) {
                   System.out.println(e.toString());
               }   public void setJbnr(String Jbnr){
           this.Jbnr=Jbnr;
       }   public String getJbnr(){
           return Jbnr;
       }   public void setJbdw(String Jbdw){
           this.Jbdw=Jbdw;
       }
       
       public String getJbdw(){
           return Jbdw;
       }
    }
    对于调用VO的类,像这样: package com.XXX;
    import java.sql.*;
    import java.util.*; public class DoJob{   private Connection con;
       private Statement stmt;
       private ResultSet rs;
       private ArrayList lis=new ArrayList();   public ArrayList query(String a){                              
           String sql="";
           sql="select a.*,b.name from temp_job a, user_basic b "
               +"where a.userid = b.userid order by a.wcqk";
           try{
               stmt=con.createStatement();
               rs=stmt.executeQuery(sql);   
               TempJob job=new TempJob();                //只要一个实例
               while (rs.next()){
                   job.setJbnr(rs.getString(1));
                   job.setJbdw(rs.getString(2));
                   lis.add(job.clone());                         //返回被clone对象
               }
         }
         catch(SQLException e){
           System.out.println(e.toString());
         }
         finally {                           
           this.rs=null;
           this.stmt=null;
           con.close();
         }   
         return lis;
       }
    }
      下面是作者对运行效率的说明:
    1. 现在有一典型的 VO 类 Auto(LightWeight):
    2. package com.test;
    3. public class Auto implements Cloneable{

    4.     private String No;
    5.     private String Addr;

    6.     public Object clone() throws CloneNotSupportedException{
    7. return super.clone();
    8.     }
    9.     public String setNo(String no){
    10.         return this.No=no;
    11.     }  
    12.     public String getNo(){
    13.         return this.No;
    14.     }  
    15.    
    16.     public String setAddr(String addr){
    17.         return this.Addr=addr;
    18.     }  
    19.     public String getAddr(){
    20.         return this.Addr;
    21.     }
    22. }

    23.     接着分别通过使用克隆和不使用克隆的 Bean 来构造 Auto 实例。
    24. 使用克隆的 Bean:
    25. package com.test;
    26. import java.io.*;
    27. import java.util.*;
    28. import org.dom4j.*;
    29. import org.dom4j.io.*;
    30. public class MyXMLReader {
    31.     Auto auto=new Auto();                                 //请比较不同
    32.     ArrayList al=new ArrayList();

    33. public ArrayList go() {
    34.     long lasting = System.currentTimeMillis();
    35.     try {
    36.      File f = new File("data_100k.xml");
    37.      SAXReader reader = new SAXReader();
    38.      Document doc = reader.read(f);
    39.      Element root = doc.getRootElement();
    40.      Element foo;
    41.      for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
    42.          foo = (Element) i.next();
    43.          auto.setNo(foo.elementText("NO"));
    44.          auto.setAddr(foo.elementText("ADDR"));
    45.                 al.add(auto.clone());                    //请比较不同
    46.      }
    47.    } catch (Exception e) {
    48.      e.printStackTrace();
    49.   }
    50.   System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");
    51.   return al;
    52.     }
    53. }

    54.     取八次运行时间
    55.     运行时间:172 毫秒
    56.     运行时间:93 毫秒
    57.     运行时间:94 毫秒
    58.     运行时间:141 毫秒
    59.     运行时间:125 毫秒
    60.     运行时间:78 毫秒
    61.     运行时间:203 毫秒
    62.     运行时间:63 毫秒
    63. 没有使用克隆的 Bean:
    64. package com.test;
    65. import java.io.*;
    66. import java.util.*;
    67. import org.dom4j.*;
    68. import org.dom4j.io.*;
    69. public class MyXMLReader {
    70.     ArrayList al=new ArrayList();
    71.     public ArrayList go() {
    72.         long lasting = System.currentTimeMillis();
    73.     try {
    74.      File f = new File("data_100k.xml");
    75.      SAXReader reader = new SAXReader();
    76.      Document doc = reader.read(f);
    77.      Element root = doc.getRootElement();
    78.      Element foo;
    79.      for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
    80.      foo = (Element) i.next();
    81.      Auto auto=new Auto();                     //请比较不同
    82.          auto.setNo(foo.elementText("NO"));
    83.          auto.setAddr(foo.elementText("ADDR"));
    84.                 al.add(auto);                             //请比较不同
    85.      }
    86.     } catch (Exception e) {
    87.      e.printStackTrace();
    88.   }
    89.   System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");
    90.   return al;
    91.     }
    92. }

    93.     取八次运行时间
    94.     运行时间:187 毫秒
    95.     运行时间:93 毫秒
    96.     运行时间:172 毫秒
    97.     运行时间:78 毫秒
    98.     运行时间:204 毫秒
    99.     运行时间:79 毫秒
    100.     运行时间:204 毫秒
    101.     运行时间:78 毫秒
    102.     通过比较,克隆与非克隆,在构造 Auto 上花的时间是差不多的。
    103.     且慢,让我们再看下面的 Auto 类。
    104. 修改一下 Auto 类的构造函数,像这样(HeavyWeight):
    105. package com.test;
    106. import java.io.*;
    107. public class Auto implements Cloneable{

    108.     private String No;
    109.     private String Addr;
    110.     private String str;
    111.     private File f = new File("data_10k.xml");
    112.     private StringBuffer sb=new StringBuffer();

    113.     public Object clone() throws CloneNotSupportedException{
    114.        return super.clone();
    115.     }
    116.     //以下方法仅仅为了构造一个 HeavyWeight 对象。
    117.     public Auto(){
    118.         try{
    119.             BufferedReader inbuffer=new BufferedReader(new FileReader(f));
    120.             while ((str=inbuffer.readLine())!=null){
    121.             sb.append(str);
    122.         }
    123.         }catch(Exception e){
    124.            System.out.println(e.toString());
    125.     }
    126.   }
    127.     public String setNo(String no){
    128.         return this.No=no;
    129.     }  
    130.     public String getNo(){
    131.         return this.No;
    132.     }  
    133.    
    134.     public String setAddr(String addr){
    135.         return this.Addr=addr;
    136.     }  
    137.     public String getAddr(){
    138.         return this.Addr;
    139.     }
    140. }

    141.     再看看测试数据呢?
    142.     使用克隆构造 Auto 实例:     不使用克隆构造 Auto 实例:
    143.     运行时间:188 毫秒           运行时间:2219 毫秒
    144.     运行时间:78 毫秒            运行时间:2266 毫秒
    145.     运行时间:109 毫秒           运行时间:2156 毫秒
    146.     运行时间:219 毫秒           运行时间:2093 毫秒
    147.     运行时间:110 毫秒           运行时间:2266 毫秒
    148.     运行时间:78 毫秒            运行时间:2141 毫秒
    149.     运行时间:157 毫秒           运行时间:2078 毫秒
    150.     运行时间:78 毫秒            运行时间:2172 毫秒
    151.     好了,让我们查看一下 Auto 类。可以看见只是在其构造函数中加入读取10K XML文件的代码,
    152. 而克隆与非克隆运行时间却有近 10 倍的差距!
    153.    
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-6 19:15 , Processed in 0.357213 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表