• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            深入 JAVA對(duì)象的復(fù)制與比較

            1.對(duì)象的復(fù)制
            2.clone()
            的使用
            3.
            對(duì)象實(shí)例的比較
            ////////////////////
            //
            /////////////////////

            1.對(duì)象的復(fù)制

             

            1.    
            2. String str1 = "This is a string!"  //這里是 "對(duì)象引用" 的復(fù)制
            3. String str2 = new String(str1);  //這里是 "對(duì)象實(shí)例" 的復(fù)制


            淺復(fù)制: 只復(fù)制復(fù)合對(duì)象本身.
            深復(fù)制: 除了復(fù)制復(fù)合對(duì)象本身, 還復(fù)制了復(fù)合對(duì)象的引用的對(duì)象實(shí)例.

            例如:

            1.  
            2. class Pupil{
            3.     public Pupil(String sno, String name, int age){
            4.         this.sno = new String(sno);
            5.         this.name = new String(name);
            6.         this.age = age;
            7.      }
            8.  
            9.     public String getSno() {
            10.         return sno;
            11.      }
            12.  
            13.     public String getName() {
            14.         return name;
            15.      }
            16.  
            17.     public int getAge() {
            18.         return age;
            19.      }
            20.  
            21.     public void setAge(int age) {
            22.         this.age = age;
            23.      }
            24.  
            25.     private String sno;
            26.     private String name;
            27.     private int age;
            28. }
            29.  
            30. public class CopyDemo {
            31.     public static Pupil[] shallowCopy(Pupil[] aClass) {
            32.          Pupil[] newClass = new Pupil[aClass.length];
            33.  
            34.         //此時(shí)newClass aClass 指向同一塊內(nèi)存
            35.         for(int i=0; i<aClass.length; i++)
            36.              newClass[i] = aClass[i];
            37.         return newClass;
            38.      }
            39.     
            40.     public static Pupil[] deepCopy(Pupil[] aClass) {
            41.          Pupil[] newClass = new Pupil[aClass.length];
            42.  
            43.         //此時(shí)newClass aClass 的相應(yīng)sno , name 指向同一塊內(nèi)存
            44.         for(int i=0; i<aClass.length; i++) {
            45.             String sno = aClass[i].getSno();
            46.             String name = aClass[i].getName();
            47.             int age = aClass[i].getAge();
            48.              newClass[i] = new Pupil(sno, name, age);
            49.          }
            50.  
            51.         return newClass;
            52.      }
            53.  
            54.     public static Pupil[] deeperCopy(Pupil[] aClass) {
            55.          Pupil[] newClass = new Pupil[aClass.length];
            56.  
            57.         //完全的復(fù)制
            58.         for(int i=0; i<aClass.length; i++) {
            59.             String sno = new String(aClass[i].getSno());
            60.             String name = new String(aClass[i].getName());
            61.             int age = aClass[i].getAge();
            62.              newClass[i] = new Pupil(sno, name, age);
            63.          }
            64.  
            65.         return newClass;
            66.      }
            67. }

             

            2.clone()的使用


            * Object.clone()
            * Cloneable
            接口
            * CloneNotSupportedException

            a.
            使用Object.clone 進(jìn)行復(fù)制
            兩個(gè)必須條件:
            1.
            一定要將重定義后的clone() 方法定義為公有方法(Object 類中, 它是受保護(hù)的成員,     不能直接使用)
            2.
            該后代類聲明實(shí)現(xiàn)接口 Cloneable 接口(當(dāng)類實(shí)現(xiàn)該接口, 其任何子類也會(huì)繼承該接口), 該接口實(shí)際上沒有任何
              
            內(nèi)容, 只是一個(gè)標(biāo)識(shí), 標(biāo)志實(shí)現(xiàn)該接口的類提供clone() 方法.(這是接口的一種非典型用法)

            1.  
            2. public class Fraction implements Cloneable {
            3.     public Object clone() {
            4.         try{
            5.             return super.clone();  //call protected method
            6.          } catch (CloneNotSupportedException e) {
            7.             return null;
            8.          }
            9.      }
            10.     //other methods ...
            11. }



            b.
            重寫Object.clone()
            例如對(duì)    private char[] cb; character buffer 進(jìn)行復(fù)制
              

            1. // add in class Cirbuf
            2.         public Object clone() {
            3.         try{
            4.              Cirbuf copy = (Cirbuf)super.clone();
            5.              copy.cb = (char[])cb.clone();
            6.             return copy;
            7.          }catch (CloneNotSupportedException e){
            8.             throw new InternalError(e.toString());
            9.          }
            10.      }


            c.
            復(fù)制數(shù)組
              
            數(shù)組是在方法調(diào)用重以引用的形式傳遞的對(duì)象. 下述情況下非常適合引用來傳遞數(shù)組:
               *
            正在接收的方法不修改數(shù)組
               *
            正在調(diào)用的方法不必關(guān)心是否修改數(shù)組
               *
            正在調(diào)用的方法想要得到數(shù)組中的修改結(jié)果
              
            否則, 就應(yīng)該在方法調(diào)用中傳遞數(shù)組對(duì)象的副本. 只需調(diào)用 arrObj.clone() 方法即可完成數(shù)組arrObj 的復(fù)制操作. 隨后將該數(shù)組副本強(qiáng)制轉(zhuǎn)換為其正確類型:
                   (type[])arrObj.clone();
                System.arraycopy
            方法提供一種用于在數(shù)組間復(fù)制多個(gè)元素的有效方式.
                     System.arraycopy(source, i, target, j, len)

            3.對(duì)象實(shí)例的比較


            例如:

            1.  
            2.      Pupil p1 = new Pupil("99184001", "zhang3", 18);
            3.      Pupil p2 = new Pupil("99184001", "zhang3", 18);


            a. "=="
                if(p1 == p2)...
              
            此次測(cè)試的是對(duì)象引用, 其結(jié)果肯定是false, 只要兩個(gè)對(duì)象引用不是互為別名就不會(huì)相等.
            b.
            淺比較   false

            1.  
            2.    if(p1.getSno() == p2.getSno() && p1.getName() == p2.getName()
            3.       && p1.getAge() == p2.getAge()) ...;


            c.
            深比較    true[/code]  
               if(p1.getSno().equals(p2.getSno()) && p1.getName().equals(p2.getName())
                  && p1.getAge() == p2.getAge()) ...;[/code]
                 JAVA API
            的跟類Object 也提供了equals() 方法, 但它只是比較兩個(gè)對(duì)象引用, 而非比較兩個(gè)對(duì)象實(shí)例.
                
            不管怎樣, 如果需要比較Pupil 類的對(duì)象(例如要將它們放入對(duì)象容器), 應(yīng)該為Pupil 類重定義equals() 方法:

            1.    
            2.     public boolean equals(Object otherobj) {
            3.         //檢查otherobj 是否為空
            4.         if(otherobj == null) return false;
            5.  
            6.         //檢查otherobj 是否就是當(dāng)前對(duì)象
            7.         if(otherobj == this) return true;
            8.  
            9.         //檢查otherobj 是否具有正確的類型, 即檢查是否可與當(dāng)前對(duì)象比較
            10.         if(!(otherobj instanceof Pupil)) return false;
            11.  
            12.         //otherobj 轉(zhuǎn)換為Pupil 類的對(duì)象引用
            13.          Pupil tmpObj = (Pupil)otherobj;
            14.         //關(guān)于學(xué)生是否相等的邏輯檢查
            15.         if(sno.equals(tmpObj.sno) && name.equals(tmpObj.name)
            16.               && age == tmpObj.age) return true;
            17.         
            18.         return false;
            19.      }


                JAVA API
            所提供的每個(gè)類幾乎都提供了采用深比較策略的equals() 方法, 例如String equals() 方法. 一般來說, 用戶自己定義的類也應(yīng)當(dāng)提供合適的equals() 方法, 特別是當(dāng)程序要將其對(duì)象放入JAVA API 所提供的對(duì)象容器類的時(shí)候
               
            按照約定, 任何類所提供的equals() 方法所實(shí)現(xiàn)的相等比較應(yīng)該是等價(jià)關(guān)系, 即滿足自反性, 對(duì)稱性和傳遞性. 另外一個(gè)類重定義了equals() 方法, 也應(yīng)該重定義相應(yīng)hashCode() 方法, 否則將這個(gè)類的對(duì)象放入映射對(duì)象容器時(shí)也會(huì)發(fā)生以外.

            posted on 2009-08-24 23:34 肥仔 閱讀(212) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Web-后臺(tái)

            日本久久中文字幕| 99精品国产综合久久久久五月天| 日日狠狠久久偷偷色综合96蜜桃| 久久久久亚洲av无码专区| 久久精品无码av| 久久久久久午夜成人影院| 一本大道久久东京热无码AV| 成人国内精品久久久久影院| 久久久久se色偷偷亚洲精品av| 久久久久一区二区三区| 99久久精品免费看国产一区二区三区| 国产精品热久久毛片| 99久久无色码中文字幕| 漂亮人妻被黑人久久精品| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久久久久久久久免免费精品| 欧洲人妻丰满av无码久久不卡| 亚洲国产天堂久久久久久| 精品久久久久久无码人妻蜜桃| 久久ww精品w免费人成| 一本一本久久a久久综合精品蜜桃| 久久亚洲AV无码西西人体| 99久久综合国产精品二区| 久久超乳爆乳中文字幕| 久久青青草原亚洲av无码app| 久久无码国产专区精品| 伊人久久五月天| 色妞色综合久久夜夜| 91麻豆国产精品91久久久| 亚洲欧美国产日韩综合久久| 久久久久亚洲精品天堂久久久久久 | 99久久亚洲综合精品成人| 99久久精品国产麻豆| av无码久久久久久不卡网站| 精品永久久福利一区二区| 99国产欧美久久久精品蜜芽| 激情伊人五月天久久综合| 国产精品久久久久久一区二区三区| 国产精品久久久亚洲| 久久se精品一区二区| 91精品国产综合久久香蕉|