【JavaSE】比较器、深拷贝浅拷贝
创始人
2025-01-16 10:33:04
0

目录

  • Comparable接口
    • 单个比较
    • 多个比较
  • Comparator接口
  • Compareable接口,Comparetor接口,equals方法对比
  • 深拷贝与浅拷贝
    • 拷贝
    • 深拷贝浅拷贝区别

Comparable接口

我们像写一个Dog类,类中包含成员变量年龄和名字。来方便以下讲解。

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

当我们要对自己的自定义类进行直接比较时会发现不能比较,这是因为这些操作符只能比较基本数据类型。

直接比较

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

单个比较

如果要实现比较功能,我们就要实现Comparable接口,并将其中的compareTo方法重写,在“继承”时将泛型写为当前类:

实现Comparable接口

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

在实现后就可以在main函数中调用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));     } 

从这我们可以看见这个比较方法是通过对象的引用来实现,如果要进行多个对象比较酒不行呢。

多个比较

我们多个比较就可以通过数组来实现,将对象放入数组中进行排序,因为我们实现了Comparable接口,我们调用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接口

在实现了Compareable接口后我们就直接将比较方法定死了,不能进行比较条件的修改。如果要解决这个问题就可以使用Comparator接口。
我们就在重新写个类来用于Dog类的名字比较,将compare方法重写:

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

然后再主函数中实例化该对象,再在调用Arrays.sort()的时候将该对象一起传入就可以实现以名字排序,如果是要用年龄排序就按同样方法写出年龄排序的类,然后Arrays.sort()调用的时候传该类就行。

Com

 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方法对比

因为所有类都有一个共同父类Object,Object类中有equals方法,我们将该方法重写也可以比较
e

    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接口实现的比较会导致比较方法定死了,Comparetor实现的比较器就可以改变比较的方法,两个都返回int数字,而equals方法只是单纯比较是否相等并且返回值是boolean类型

深拷贝与浅拷贝

拷贝

我们要直接将我们的一个对象给到新对象,像基本数据类型那样用=肯定是不行的,这就需要用到clone方法了:
步骤如下
1.在类中重写clone方法,因为clone方法是Object类的,直接重写就行
2.实现Cloneable接口,该接口是一个空接口,但是必须实现该接口来表示当前类可以克隆

1

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.在调用克隆的方法还要实现异常throws CloneNotSupportedException
4.调用clone还用向下转型

2

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

深拷贝浅拷贝区别

二者区别就在与如果当前类还有其他类的对象时,该拷贝是否将该对象一起拷贝。
如果重新开辟了空间拷贝过去了,那就是深拷贝,
如果没有还是指向原来的空间,那就是浅拷贝。

如果要实现深拷贝就在我们类中重写的clone方法中将类中对象也clone,并且类中对象所在类也实现了克隆:
3

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; 	} } 

相关内容

热门资讯

2026版方法!火神微信辅助(... 2026版方法!火神微信辅助(辅助)其实是真的有辅助神器(有挂规律)1、点击下载安装,火神微信辅助脚...
操作辅助!奇迹陕西靖边锅子有没... 操作辅助!奇迹陕西靖边锅子有没有技巧!曝光真的有辅助挂(有挂教学)进入游戏-大厅左侧-新手福利-激活...
黑科技辅助挂!威信茶馆跑辅助器... 黑科技辅助挂!威信茶馆跑辅助器(辅助)果然确实有辅助app(真实有挂)1、在威信茶馆跑辅助器插件功能...
要领辅助!好友赣南插件!了解是... 要领辅助!好友赣南插件!了解是有辅助器(证实有挂)1)好友赣南插件免费钻石:进一步探索好友赣南插件免...
随着!决战平安京辅助软件(辅助... 随着!决战平安京辅助软件(辅助)切实存在有辅助挂(有挂透视)1、打开软件启动之后找到中间准星的标志长...
手册辅助!哈灵脚本修改器!解迷... 手册辅助!哈灵脚本修改器!解迷存在有辅助工具(有挂方法)运哈灵脚本修改器辅助工具,进入游戏界面。进入...
此事迅速冲上热搜!微信小程序财... 此事迅速冲上热搜!微信小程序财神十三张辅助(辅助)切实真的是有辅助挂(有挂教程)1、下载好微信小程序...
指引辅助!快玩炸翻天辅助工具!... 指引辅助!快玩炸翻天辅助工具!辅助是真的有辅助软件(真的有挂)在进入快玩炸翻天辅助工具软件靠谱后,参...
方法辅助挂!雀神广东麻将推倒胡... 方法辅助挂!雀神广东麻将推倒胡辅助器下载(辅助)真是真的是有辅助app(果真有挂)1、该软件可以轻松...
方案辅助!广西友玩修改器!普及... 方案辅助!广西友玩修改器!普及真的是有辅助技巧(真的有挂)广西友玩修改器透视方法中分为三种模型:广西...