欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

Comparable接口

我們像寫(xiě)一個(gè)Dog類(lèi),類(lèi)中包含成員變量年齡和名字。來(lái)方便以下講解。

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

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

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

單個(gè)比較

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

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方法來(lái)比較:

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

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

多個(gè)比較

我們多個(gè)比較就可以通過(guò)數(shù)組來(lái)實(shí)現(xiàn),將對(duì)象放入數(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)行比較條件的修改。如果要解決這個(gè)問(wèn)題就可以使用Comparator接口。
 

我們就在重新寫(xiě)個(gè)類(lèi)來(lái)用于Dog類(lèi)的名字比較,將compare方法重寫(xiě):

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í)例化該對(duì)象,再在調(diào)用Arrays.sort()的時(shí)候?qū)⒃搶?duì)象一起傳入就可以實(shí)現(xiàn)以名字排序,如果是要用年齡排序就按同樣方法寫(xiě)出年齡排序的類(lèi),然后Arrays.sort()調(diào)用的時(shí)候傳該類(lèi)就行。

 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方法對(duì)比

因?yàn)樗蓄?lèi)都有一個(gè)共同父類(lèi)Object,Object類(lèi)中有equals方法,我們將該方法重寫(xiě)也可以比較

    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)的比較會(huì)導(dǎo)致比較方法定死了,Comparetor實(shí)現(xiàn)的比較器就可以改變比較的方法,兩個(gè)都返回int數(shù)字,而equals方法只是單純比較是否相等并且返回值是boolean類(lèi)型

深拷貝與淺拷貝

拷貝

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

步驟如下

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

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

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)前類(lèi)還有其他類(lèi)的對(duì)象時(shí),該拷貝是否將該對(duì)象一起拷貝。

如果重新開(kāi)辟了空間拷貝過(guò)去了,那就是深拷貝,

如果沒(méi)有還是指向原來(lái)的空間,那就是淺拷貝。

如果要實(shí)現(xiàn)深拷貝就在我們類(lèi)中重寫(xiě)的clone方法中將類(lèi)中對(duì)象也clone,并且類(lèi)中對(duì)象所在類(lèi)也實(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于@SpringBootApplication與@SpringBootTest的區(qū)別及用法

    關(guān)于@SpringBootApplication與@SpringBootTest的區(qū)別及用法

    這篇文章主要介紹了關(guān)于@SpringBootApplication與@SpringBootTest的區(qū)別及用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springboot中項(xiàng)目啟動(dòng)時(shí)實(shí)現(xiàn)初始化方法加載參數(shù)

    springboot中項(xiàng)目啟動(dòng)時(shí)實(shí)現(xiàn)初始化方法加載參數(shù)

    這篇文章主要介紹了springboot中項(xiàng)目啟動(dòng)時(shí)實(shí)現(xiàn)初始化方法加載參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java 中數(shù)組初始化實(shí)例詳解

    java 中數(shù)組初始化實(shí)例詳解

    這篇文章主要介紹了 本文主要講數(shù)組的初始化方法、可變參數(shù)列表以及可變參數(shù)列表對(duì)函數(shù)重載的影響的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java SpringMVC異常處理機(jī)制詳解

    Java SpringMVC異常處理機(jī)制詳解

    這篇文章主要介紹了springmvc如何進(jìn)行異常處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 淺析java雙向冒泡排序算法

    淺析java雙向冒泡排序算法

    這篇文章主要介紹了淺析java雙向冒泡排序算法,并附上源碼,需要的朋友可以參考下
    2015-02-02
  • idea無(wú)法打斷點(diǎn),單擊或雙擊代碼行左側(cè)區(qū)域無(wú)效的解決

    idea無(wú)法打斷點(diǎn),單擊或雙擊代碼行左側(cè)區(qū)域無(wú)效的解決

    這篇文章主要介紹了idea無(wú)法打斷點(diǎn),單擊或雙擊代碼行左側(cè)區(qū)域無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringMVC攔截器超詳細(xì)解讀

    SpringMVC攔截器超詳細(xì)解讀

    SpringMVC的處理器攔截器,類(lèi)似于Servlet開(kāi)發(fā)中的過(guò)濾器Filter,用于對(duì)處理器進(jìn)行預(yù)處理和后處理。?依賴于web框架,在實(shí)現(xiàn)上基于Java的反射機(jī)制,屬于面向切面編程(AOP)的一種運(yùn)用
    2022-07-07
  • SSH框架網(wǎng)上商城項(xiàng)目第20戰(zhàn)之在線支付平臺(tái)

    SSH框架網(wǎng)上商城項(xiàng)目第20戰(zhàn)之在線支付平臺(tái)

    這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第20戰(zhàn)之在線支付平臺(tái),關(guān)于第三方支付的內(nèi)容從本文開(kāi)始,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Rabbitmq中的channel接口常用方法詳解

    Rabbitmq中的channel接口常用方法詳解

    這篇文章主要介紹了Rabbitmq中的channel接口常用方法詳解,為了確保消息一定被消費(fèi)者處理,rabbitMQ提供了消息確認(rèn)功能,就是在消費(fèi)者處理完任務(wù)之后,就給服務(wù)器一個(gè)回饋,服務(wù)器就會(huì)將該消息刪除,需要的朋友可以參考下
    2023-09-09
  • Spring?IOC容器FactoryBean工廠Bean實(shí)例

    Spring?IOC容器FactoryBean工廠Bean實(shí)例

    這篇文章主要為大家介紹了Spring?IOC容器FactoryBean工廠Bean實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論