关于java 基本类型及引用类型的大小比较问题

目录

  • 基本类型的比较
  • 引用类型的比较
    • 关于 == 比较重要总结
    • 内置类型
    • 自定义类型

基本类型的比较

就是简单的大于小于 不等于之类的比较就好啦!没什么好说的。

引用类型的比较

引用类型的比较,无非是两种思路:使用Comparable接口中的compareTo() 方法进行比较、使用 Comparator 接口中的
compare() 方法进行比较。

使用Comparable接口中的compareTo()
方法进行比较的时候,如果是内置引用类型,那么可以直接调用compareTo()方法,因为jdk已经帮助我们实现了该方法。如果是自定义类型,我们需要在定义类的时候继承Comparable接口,实现compareTo()方法,然后调用进行比较。

使用 Comparator 接口中的 compare() 方法进行比较的时候,我们需要单独定义一个业务类,此业务类继承Comparator
接口,实现 compare() 方法。在使用的时候,调用此业务类中的 compare() 方法,然后传入要比较的两个引用类型。

两边都是引用类型用= = 比较会出问题的!!!
先来一个代码解释我为什么这么说

public static void main(String[] args) {
     

        Integer a = 1;
        Integer b = 1;
        if (a == b) {
     
            System.out.println("hhhhh");//√
        } else {
     
            System.out.println("aaaaa");  
        }
        Integer c = 129;
        Integer d = 129;
        if (c == d) {
     
            System.out.println("hhhhh");
        } else {
     
            System.out.println("aaaaa");  // √
        } 
    }

我一眼上去那肯定是 hhhhh hhhhh ,很遗憾如果你和我一样,确实是基础不够扎实啊

来看看源码吧!

关于java 基本类型及引用类型的大小比较问题_第1张图片
关于IntegerCache 的解释放这里了
关于java 基本类型及引用类型的大小比较问题_第2张图片

这是什么意思呢?就是说,如果 i 的值在一个范围的(-128~ 127),直接比较,而这个数字就放在常量池里面
如果超出了这个范围的化 就要通过 new 一个对象

那么我们再回到上面的那段代码
返回的引用类型便是已经存在cache的引用,也就是说相同的数字1,a和b实则为同一个对象的引用,所以当然相等啦。
然后,当数据大小超出范围时,就会重新new一个新的对象,虽然都是129,
c和d是不同对象的引用,所以不相等啦!

实际上对于这种原始类型的封装类进行大小比较时,没人会直接拿 = = 来比较,正确的方式时使用equals()方法来比较

原始类型的封装类直接使用 = = 来比较大小时,都有一个范围,但是超出这个范围便不能直接使用= =,但是(重要的事情都是但是)
对内置类 引用类型数据进行大小比较时,强烈建议用equals()方法。

关于 == 比较重要总结

= =可用于基本类型和引用类型
1.当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同。
2.基本类型没有equals方法,equals只比较值(对象中的内容)是否相同(相同返回true)。
3.一个类如果没有定义equals方法,它将默认继承Object中的equals方法,返回值与==方法相同。

内置类型

  1. 内置引用类型的大小比较
    jdk提供了内置引用类型的排序规则,这些内置引用类型继承了 Comparable 接口,重写了 compareTo() 方法。我们可以直接调用 compareTo() 方法。

内置引用类型的排序规则如下:

整数、浮点数(Integer、Float、Double):直接比较基本数据类型的大小。 返回0:等于;返回1:大于;返回-1:小于 。
字符:返回unicode码之差。
字符串:如果其中一个字符串是另外一个字符串其实开始的子串,返回长度之差,例如: “abcde” 和 “abc” ;否则返回第一个不相等的unicode码之差。
日期类:根据日期对应的的长整型数比较。返回0:等于;返回1:大于;返回-1:小于 。

自定义类型

jdk中没有提供自定义类型的比较方法,我们需要根据需求自己来决定自定义类型的比较规则。
具体的做法是:
使自定义类型继承 Comparable 接口,根据我们自己的需求实现compareTo() 方法。
然后就可以像内置应用类型一样,调用该方法进行比较。

你可能感兴趣的:(Java,基础,java)