最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaSE中比較器、深拷貝淺拷貝舉例詳解

 更新時間:2024年07月18日 09:33:43   作者:鴿鴿程序猿  
在Java中一切都可以視為對象,在Java中我們經(jīng)常使用引用去操作對象,下面這篇文章主要給大家介紹了關(guān)于JavaSE中比較器、深拷貝淺拷貝的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

Comparable接口

我們像寫一個Dog類,類中包含成員變量年齡和名字。來方便以下講解。

public class Dog {
    public int age;
    public String name;
    @Override
    public String toString() {
        return "Dog{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

當(dāng)我們要對自己的自定義類進(jìn)行直接比較時會發(fā)現(xiàn)不能比較,這是因?yàn)檫@些操作符只能比較基本數(shù)據(jù)類型。

public static void main(String[] args) {
        Dog dog1 = new Dog(6,"xiaohei");
        Dog dog2 = new Dog(7,"xiaobai");
        System.out.println(dog1 > dog2);
    }

單個比較

如果要實(shí)現(xiàn)比較功能,我們就要實(shí)現(xiàn)Comparable接口,并將其中的compareTo方法重寫,在“繼承”時將泛型寫為當(dāng)前類:

public class Dog implements Comparable<Dog> {
	private int age;
	public int compareTo(Dog o) {
		return this.age - o.age;
	}
}

在實(shí)現(xiàn)后就可以在main函數(shù)中調(diào)用compareTo方法來比較:

 public static void main(String[] args) {
        Dog dog1 = new Dog(6,"xiaohei");
        Dog dog2 = new Dog(7,"xiaobai");
        System.out.println(dog1 .compareTo(dog2));
    }

從這我們可以看見這個比較方法是通過對象的引用來實(shí)現(xiàn),如果要進(jìn)行多個對象比較酒不行呢。

多個比較

我們多個比較就可以通過數(shù)組來實(shí)現(xiàn),將對象放入數(shù)組中進(jìn)行排序,因?yàn)槲覀儗?shí)現(xiàn)了Comparable接口,我們調(diào)用Arrays.sort()方法就行:

 public static void main(String[] args) {
        Dog dog1 = new Dog(6,"xiaohei");
        Dog dog2 = new Dog(7,"xiaobai");
        Dog dog3 = new Dog(5,"xiaodog");
        Dog dog4 = new Dog(8,"wangcai");
        Dog[] dogs = new Dog[]{dog1,dog2,dog3,dog4};

        Arrays.sort(dogs);

        for (int i = 0; i < dogs.length; i++) {
            System.out.println(dogs[i].toString());

        }
    }

Comparator接口

在實(shí)現(xiàn)了Compareable接口后我們就直接將比較方法定死了,不能進(jìn)行比較條件的修改。如果要解決這個問題就可以使用Comparator接口。
 

我們就在重新寫個類來用于Dog類的名字比較,將compare方法重寫:

import java.util.Comparator;

public class NameComparator implements Comparator<Dog> {
    @Override
    public int compare(Dog o1, Dog o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

然后再主函數(shù)中實(shí)例化該對象,再在調(diào)用Arrays.sort()的時候?qū)⒃搶ο笠黄饌魅刖涂梢詫?shí)現(xiàn)以名字排序,如果是要用年齡排序就按同樣方法寫出年齡排序的類,然后Arrays.sort()調(diào)用的時候傳該類就行。

 public static void main(String[] args) {
        Dog dog1 = new Dog(6,"xiaohei");
        Dog dog2 = new Dog(7,"xiaobai");
        Dog dog3 = new Dog(5,"xiaodog");
        Dog dog4 = new Dog(8,"wangcai");
        Dog[] dogs = new Dog[]{dog1,dog2,dog3,dog4};

        NameComparator nameComparator = new NameComparator();
        Arrays.sort(dogs,nameComparator);

        for (int i = 0; i < dogs.length; i++) {
            System.out.println(dogs[i].toString());

        }
    }

Compareable接口,Comparetor接口,equals方法對比

因?yàn)樗蓄惗加幸粋€共同父類Object,Object類中有equals方法,我們將該方法重寫也可以比較

    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Dog dog = (Dog) o;
        return age == dog.age && Objects.equals(name, dog.name);
    }

Compareable接口實(shí)現(xiàn)的比較會導(dǎo)致比較方法定死了,Comparetor實(shí)現(xiàn)的比較器就可以改變比較的方法,兩個都返回int數(shù)字,而equals方法只是單純比較是否相等并且返回值是boolean類型

深拷貝與淺拷貝

拷貝

我們要直接將我們的一個對象給到新對象,像基本數(shù)據(jù)類型那樣用=肯定是不行的,這就需要用到clone方法了:

步驟如下

1.在類中重寫clone方法,因?yàn)閏lone方法是Object類的,直接重寫就行

2.實(shí)現(xiàn)Cloneable接口,該接口是一個空接口,但是必須實(shí)現(xiàn)該接口來表示當(dāng)前類可以克隆。

public class Dog implements Cloneable {
	public String name;
	public int age;
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	public Dog(String name, int age) {
		this.age = age;
		this.name = name;
	}
}

3.在調(diào)用克隆的方法還要實(shí)現(xiàn)異常throws CloneNotSupportedException

4.調(diào)用clone還用向下轉(zhuǎn)型

public static void main(String[] args) 
		throws CloneNotSupportedException {
	Dog dog1 = new Dog("xiaohei",6);
	Dog dog2 = (Dog)dog1.clone();
}

深拷貝淺拷貝區(qū)別

二者區(qū)別就在與如果當(dāng)前類還有其他類的對象時,該拷貝是否將該對象一起拷貝。

如果重新開辟了空間拷貝過去了,那就是深拷貝,

如果沒有還是指向原來的空間,那就是淺拷貝。

如果要實(shí)現(xiàn)深拷貝就在我們類中重寫的clone方法中將類中對象也clone,并且類中對象所在類也實(shí)現(xiàn)了克?。?/strong>

class Price implements Cloneable {
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}
public class Dog implements Cloneable {
	public String name;
	public int age;
	Price price = new Price();
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	public Dog(String name, int age) {
		this.age = age;
		this.name = name;
	}
}

總結(jié) 

到此這篇關(guān)于JavaSE中比較器、深拷貝淺拷貝的文章就介紹到這了,更多相關(guān)JavaSE比較器、深拷貝淺拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中DataSource配置失敗問題的解決方法

    SpringBoot中DataSource配置失敗問題的解決方法

    在SpringBoot項(xiàng)目里,當(dāng)嘗試啟動應(yīng)用程序時,有時會遇到Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured錯誤, 本文記錄了如何解決Spring Boot中DataSource配置失敗問題,需要的朋友可以參考下
    2025-06-06
  • mybatis 獲取無數(shù)據(jù)的字段不顯示的問題

    mybatis 獲取無數(shù)據(jù)的字段不顯示的問題

    這篇文章主要介紹了mybatis 獲取無數(shù)據(jù)的字段不顯示的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • @Conditional注解的使用場景和源碼解析

    @Conditional注解的使用場景和源碼解析

    這篇文章主要介紹了@Conditional注解的使用場景和源碼解析,@Conditional是一個條件注解,它的作用是判斷Bean是否滿足條件,如果滿足條件,則將Bean注冊進(jìn)IOC中,如果不滿足條件,則不進(jìn)行注冊,需要的朋友可以參考下
    2023-11-11
  • Java接口的回調(diào)機(jī)制的實(shí)現(xiàn)

    Java接口的回調(diào)機(jī)制的實(shí)現(xiàn)

    本文主要介紹了Java中回調(diào)機(jī)制的實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單鏈表與雙向鏈表

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單鏈表與雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)單鏈表、雙向鏈表的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 詳解Java中的ReentrantLock鎖

    詳解Java中的ReentrantLock鎖

    這篇文章主要介紹了Java中ReentrantLock鎖的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • 詳解Java Stream實(shí)現(xiàn)精準(zhǔn)數(shù)據(jù)分組與比例計(jì)算技巧

    詳解Java Stream實(shí)現(xiàn)精準(zhǔn)數(shù)據(jù)分組與比例計(jì)算技巧

    這篇文章主要介紹了Java Stream實(shí)現(xiàn)精準(zhǔn)數(shù)據(jù)分組與比例計(jì)算技巧,通過具體的實(shí)戰(zhàn)案例進(jìn)行詳細(xì)講解,首先我們會介紹如何使用Stream對數(shù)據(jù)進(jìn)行分組,然后通過收集器對分組后的數(shù)據(jù)進(jìn)行統(tǒng)計(jì),最后計(jì)算出每種類型的占比,需要的朋友可以參考下
    2026-01-01
  • SpringBoot2自動裝配原理解析

    SpringBoot2自動裝配原理解析

    這篇文章主要介紹了SpringBoot2自動裝配原理解析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 簡單驗(yàn)證碼生成Java版

    簡單驗(yàn)證碼生成Java版

    這篇文章主要為大家詳細(xì)介紹了簡單驗(yàn)證碼生成Java版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • spring 整合kafka監(jiān)聽消費(fèi)的配置過程

    spring 整合kafka監(jiān)聽消費(fèi)的配置過程

    這篇文章主要介紹了spring 整合kafka監(jiān)聽消費(fèi)的配置過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

新竹县| 兴义市| 嘉义市| 丰顺县| 松潘县| 克拉玛依市| 德兴市| 江阴市| 武安市| 布尔津县| 玛沁县| 青河县| 盐源县| 黄石市| 泗洪县| 康保县| 峨眉山市| 桑植县| 五常市| 永登县| 子长县| 柞水县| 舒城县| 黔东| 顺平县| 紫金县| 呼和浩特市| 科尔| 普宁市| 伊通| 青岛市| 泾川县| 锡林浩特市| 石柱| 牡丹江市| 汉源县| 彩票| 遂川县| 定结县| 无极县| 云浮市|