接口的使用----->排序和Object类中方法的分析

#学习记录#学习笔记

##分析Object类

比较大小

那么如何来比较两个自定义类型数据的大小??

用到Comparable接口里的方法compareTo方法

首先类先实现Comparable

再重写方法

排序数组:用Arrays的sort

注意事项: 对于 sort 方法来说, 需要传入的数组的每个对象都是 "可比较" 的, 需要具备 compareTo 这样的能力. 通 过重写 compareTo 方法的方式, 就可以定义比较规则

对于为什么mySort方法里面用的是Comparable[] compares这个接口类数组作为形参:在我们调用Arrays.sort的方法的时候,如果不重写compareTo方法,就会在代码320行报错

所以对于其他的自定义类而言,只要实现了该接口,就能强转,强转后我们的形参就能够接收,所以以接口来作为形参通用性更加。不会出现来一个其他的类型的数组,这个形参就接收不了的情况。。。        

所以得出结论,只要是自定义类型进行比较(两两比较,多个比较排序) 该类都必须实现接口Comparable。

为了弄清楚Arrays.sort的原理,我们尝试自己写一个类似sort的排序方法(核心:冒泡排序)

可以通过修改compareTo方法里的return值来达到升降序效果,因为一个方法写好了就不太能去修改了,通过改这里其实也行,但是不推荐,一般是在重写方方法里根据需要进行调整。结论this.age-o.age 从小到大排,        

对于上述的方法而言,一旦重写的compareTo写好了,就定格下来了,比如以年龄为规则,则sort只能根据年龄比,不能在根据名字比了,不解耦,现在我们引入Comparator这个接口,定义一个比较器,向sort方法传递不同的比较器进行不同规则的比较,更加灵活多变

比较器:

Comparator接口中的T和Comparable是一样的,比较那个类,就写那个类

理解这个过程如下:

那么在这里就实现了解耦,想以年龄为规则就传一个age的比较器,以名字为规则就传name的比较器给sort就行,特别方便,灵活。。。。。。

Object类

Object类是所有类的父类

equals

我们如果要判断两个对象是否相同,如果直接写引用变量是肯定不行的,因为我们知道引用里存的是对象的地址,new了两个不同的对象,地址肯定也不一样,即使名字年龄啥的一样也没用。那如何根据年龄和名字和比呢?如果说年龄和名字一样就一样。。

直接用equals也是无济于事

解决方案:在类中重写equals

编译器生成的:

自己写的

注意:name比较必须使用equals来比较,不能用等号,因为name是String字符串类型,一旦用等号来比较    ==  两边是引用变量,比较的就不是name的内容了,比较的就是地址了。同时这个equals不是Objet的equals,是String这个类自己专门的,重写的equals,能够像我们现在正在重写的这个equals一样,不比较地址,而是比较内容。

hashCode

hashCode也是Object类的一个方法,用来输出对象的地址(引用的内容)

对于两个不同的对象,输出的地址不一样是合情的,但是从逻辑上来讲,对象的内容一样,输入的地址应该一样,怎么才能一样呢?        

对于上述重写的equals和hashCode其实编译器可以帮我们生成

对象得克隆   Clone

接口:Cloneable-----》自定义类想要被克隆必须实现该接口,该接口是一个空接口,用做克隆标志。

堆栈图:只克隆了person1对象,没有克隆Money对象,叫做浅拷贝,那么如果将Money也克隆一份,就是深拷贝

实现过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值