一.关于基本数据类型之间的比较
1.在java中共存在八种数据类型,如下:
对于八种基本数据类型而言:由于其并不是对象,也无法调用任何与比较相关的方法进行比较,所以其一般用==进行数值之间的比较,也就是说,对于基本数据类型而言,其比较只能是数据数值之间的比较
例如:
1关于同一类型的比较,只要数值大小相等,其结果就为相等
(其结果为TRUE)
2.关于int 、char、 byte、 long、 float、double类型数值之间的比较,只要其数值大小相等,我们在比较时仍然可以认为他们相等
(结果为TRUE)
结果为TRUE
二.引用数据类型之间的比较
2.1关于基本数据类型的包装类
关于八种基本数据类型的包装类如下:
,(答案为FALSE)
谈到基本数据类型的包装类,我们不妨先去讲一下有关包装类的一些基本知识点:
包装类作用
1、Java是面向对象的语言,包装类将基本数据类型包装转化为类的形式,具有面向对象的特征。
2、Java集合中只能放入包装类型,而不支持基本类型。Object类是所有类的父类,而且是唯一不用指定明确继承的类。
3、Java类型间的转换可以通过包装类的方法实现,基本数据类型没有类的属性方法。
自动装箱拆箱
包装类与基本数据类型间转换可以通过自动装箱拆箱实现
valueOf() 将其他类型转为对应的包装类,用法:
static Integer valueOf(int i)
static Integer valueOf(String s)
static Integer valueOf(String s, int radix)
缓存池:在类中预先创建频繁使用的包装类对象。
1、包装器类提供了对象的缓存,String类提供了常量池,都有final修饰,对象一经创建后不可修改。
2、节省创建对象的时间开销。对象可以自由共享。
3、缓存范围:
数字类型(Byte、Short、Integer、Long)都是-128~127;
Character类:0~127;
Boolean类:true和false都有;
浮点类型(Float、Double):没有缓存值。
4、缓存池的概念是针对包装类的,不同包装类的对象比较要用equals(),基本数据类型没有类的方法,比较用==
既然我们讲到缓存池,就引出了关于对包装类对象的比较问题:
4.1如果我们用缓存范围内的数利用自动装箱进行创建对象,如果在数字相同的情况下,我们把建立的对象用==比较时,结果是相等的,例子如下:
(其结果为TRUE)
4.2但是如果我们依然用new的方式建立包装类的对象,即使在值相同的情况下,建立出的两个对象仍不能被判定为同一个对象
(结果是FALSE)
2.2关于引用数据类型之间的比较,我们一般使用重写equals()方法或者对comparator接口中的compare()方法进行重写,或者通过引用compareable接口并重写compareTo()方法
关于对这几种比较方式的论述如下:
2.2.1equals()方法
①对于基本数据类型而言,==和equals()方法没有任何区别
②对于引用数据类型而言,我们一般通过实现对equals()方法的重写实现对比较类型对象内容进行比较,拿string类而言,我们通过查看源码观察其底层对equals()方法的重写
通过查看String类中对equals方法的重写也为我们自定义类中利用equals()方法来比较对象提供了一定的参考思路:①判断比较的两个对象是否是同一个对象②判断两个比较对象是否同属于一个类
③对对象的每个属性依次进行比较
而如果类中没有对equals()方法进行重写,那么将调用的是Object类中的equals()的比较方法
如下:
我们不难发现,在object类中的equals()方法事实上是在比较两个对象是同一个对象
所以当我们进行自定义类时,我们如果想要比较对象的内容是否相等,我们必须去对equals()方法进行重写。
前序:
如果我们相对引用数据类型进行某种排序或者比较,我们必须确保其内部有一定的比较准则,即必须引用comparator接口或者comparable接口,并实现对其相关比较方法的重写,否则会在比较时产生异常
如下:
2.2.2comparable接口
通过comparable接口实现对对象的比较,我们在定义比较类时需要引用 comparable接口,并根据比较类的特征实现对其compareTo()方法的重写
如果我们想要在排序后将比较的对象放入容器中,如果想要最后形成升序排列,我们应该用this-o(或者是this.属性-o.属性),降序则为o-this
2.2.3comparator接口
通过comparator接口实现对对象的比较,我们在定义比较类时需要引用 comparator接口,并根据比较类的特征实现对其compare()方法的重写
与comparable接口类似
如果我们想要在排序后将比较的对象放入容器中,如果想要最后形成升序排列,我们应该用o1-o2(或者是o1.属性-o2.属性),降序则为o2-o1
关于对comparable和comparator接口的比较
1.一般我们在设计时会将comparable接口中的compareTo方法设置为我们默认的比较方法,而可以通过对comparator接口的引用另外实现几种额外的比较方法
2.comparable比较方法的简单,但是需要修改比较类的源码,其对代码的侵入性比较强,而comparator可以额外通过实现外部类去引用comparator接口,通过将该接口的一个匿名类对象当做参数传递给Collections.sort()方法或者Arrays.sort()方法实现排序
例子如下:
3.Comparable接口只提供了一个compareTo()方法;Comparator接口不仅提供了compara()方法,还提供了其他默认方法,如reversed()、thenComparing(),使我们可以按照更多的方式进行排序
4.Comparable接口位于java.lang包下;Comparator位于java.util包下