1.equals
- 用来比较两个对象的内容
- 返回值是boolean
public static void main(String[] args) {
People[] people = new People[2];
people[0] = new People("zk",19);
people[1] = new People("zk",19);
System.out.println(people[0].equals(people[1]));
}
调用时需要重写equals方法
public boolean equals(Object obj) {
People tmp = (People) obj;
return this.name.equals(tmp.name)
&&this.age == tmp.age;
}
如果两个对象的内容相同则会返回true
2.CompareTo
通过接口实现,同样的调用时需要重写compareTo方法,值得一提的是Arrays.sort()方法可以通过调用compareTo来实现排序
public static void main(String[] args) {
People[] people = new People[2];
people[0] = new People("zk",19);
people[1] = new People("river",20);
System.out.println("排序前:"+Arrays.toString(people));
Arrays.sort(people);
System.out.println("排序后:"+Arrays.toString(people));
}
}
public int compareTo(People o) {
return this.age - o.age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
但是作用单一,如果要以不同的方式排序需要自己修改
这时候的解决方案就是使用Comparetor接口
3.Comparator
与之相同的由接口实现,但是Arrays.sort()调用的时候需要输入两个参数,因此它能够实现按自己的想法来排序
创建类实现接口,<>里要比较什么放什么,在选择以什么排序时,创建对应类的对象之后作为Arrays.sort 的参数
public static void main(String[] args) {
People[] people = new People[2];
people[0] = new People("zk",19);
people[1] = new People("river",20);
namePeople o1 = new namePeople();
agePeople o2 = new agePeople();
System.out.println("以name来排");
Arrays.sort(people,o1);
System.out.println(Arrays.toString(people));
System.out.println("以age来排");
Arrays.sort(people,o2);
System.out.println(Arrays.toString(people));
}
public class namePeople implements Comparator<People> {
@Override
public int compare(People o1, People o2) {
return o1.name.compareTo(o2.name);
}
}
public class agePeople implements Comparator<People> {
@Override
public int compare(People o1, People o2) {
return o1.age - o2.age;
}
}
以name来排序就是按照字母的ASCLL码值来进行比较
总结:
equals用来直接比较内容,compareTo和comparator通过接口实现,但是compareTo只能单一比较,comparator可以实现多个接口多个比较
4.clone
4.1什么是克隆
用克隆方法对一个对象进行克隆,这就是克隆
在方法内部重写克隆方法,此时可以使用克隆方法,但还是会报错
这是因为方法返回值是Object,需要向下转型为people
对类实现克隆接口,可是点击克隆方法一看什么也没有,因为这个接口的存在意义就是允许这个类实现克隆
但是仍旧报错
最后抛出异常,直接在main方法之后补上这句话就可以解决
4.2浅拷贝和深拷贝
在people类里再创建一个Money类,然后打印出来
在这里可以看到修改po1的值,而打印的值相同,这说明po和po1使用的是相同的
这就是浅拷贝 ,没有克隆Money
这里用一张图片来表示
而要实现深拷贝,就需要给Money类也实现克隆接口,并重写克隆方法
再把people类的克隆方法修改一下
这里用一张图片来表示
此时打印的结果就是深拷贝之后的
总结:
- 克隆需要使用克隆方法
- 类要重写克隆方法
- 实现克隆接口
- 解决抛出异常的问题
- 自定义类型要想完成克隆就必须向下转型
- 如果要实现深拷贝则把要深拷贝的类也实现克隆