Java的三个接口Comparable,Comparator,Cloneable(浅拷贝与深拷贝)
warning:
这篇文章距离上次修改已过279天,其中的内容可能已经有所变动。
Comparable接口:
public interface Comparable<T> {
public int compareTo(T o);
}
Comparable接口被用来建立对象之间的排序。实现了Comparable接口的类的对象可以直接使用Arrays.sort()等工具进行排序。
Comparator接口:
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
Comparator接口被用来建立对象之间的排序,但是Comparator接口通常在类的外部被实现,不需要改变类的内部结构。
Cloneable接口:
public interface Cloneable {
}
Cloneable接口是个标记接口,实现了Cloneable接口的类对象可以被克隆。克隆对象有浅克隆和深克隆。浅克隆只复制对象本身和对象中值类型的成员变量,不复制引用类型的成员变量,而深克隆会复制对象本身以及所有引用类型的成员变量。
浅克隆示例:
public class Student implements Cloneable {
private String name;
private Address address;
// 构造方法、getter和setter省略
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Address {
private String street;
// 构造方法、getter和setter省略
}
// 使用
Student original = new Student("John", new Address("123 Main St"));
Student shallowCopy;
try {
shallowCopy = (Student) original.clone();
} catch (CloneNotSupportedException e) {
// 处理异常
}
// original 和 shallowCopy 的 address 指向相同的对象
深克隆示例:
public class Student implements Cloneable {
private String name;
private Address address;
// 构造方法、getter和setter省略
@Override
public Object clone() throws CloneNotSupportedException {
Student student = (Student) super.clone();
student.setAddress((Address) this.address.clone());
return student;
}
}
public class Address implements Cloneable {
private String street;
// 构造方法、getter和setter省略
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
// 使用
Student original = new Student("John", new Address("123 Main St"));
Student deepCopy;
try {
deepCopy = (Student) original.clone();
} catch (CloneNotSupportedException e) {
// 处理异常
}
// original 和 deepCopy 的 address 指向不同的对象
注意:深克隆需要对所有可变的成员变量进行克隆,如果有很多可变成员变量,这会是一项繁琐的工作。Java 8 引入了一个新的类 java.util.Optional
,它提供了一种更好的方式来处理可能为空的对象。
评论已关闭