关于java中基本数据类型和引用数据类型之间的比较

一.关于基本数据类型之间的比较

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包下


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘子干测开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值