JavaSE中比較器、深拷貝淺拷貝舉例詳解
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ū)別及用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01springboot中項(xiàng)目啟動(dòng)時(shí)實(shí)現(xiàn)初始化方法加載參數(shù)
這篇文章主要介紹了springboot中項(xiàng)目啟動(dòng)時(shí)實(shí)現(xiàn)初始化方法加載參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12idea無(wú)法打斷點(diǎn),單擊或雙擊代碼行左側(cè)區(qū)域無(wú)效的解決
這篇文章主要介紹了idea無(wú)法打斷點(diǎn),單擊或雙擊代碼行左側(cè)區(qū)域無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09SSH框架網(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-06Spring?IOC容器FactoryBean工廠Bean實(shí)例
這篇文章主要為大家介紹了Spring?IOC容器FactoryBean工廠Bean實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05