基本类型的比较VS引用类型的比较

基本类型的比较VS引用类型的比较

数据类型的介绍

类型的比较,在Java中有两种数据类型,一种是基本数据类型,一中是引用类型。

基本数据类型包含一些我们常用的数据:

类型类型名称
byte字节型
int整型
char字符型
double浮点型
boolean布尔型
…………

而引用类型最常见的有:

类型类型名称
String字符串
Array数组
类、接口、数组、枚举、注解、泛型……

其中还有使用引用类型书写的基本数据类型:

基本数据类型引用类型
byteByte
intInteger
charCharacter
doubleDouble
booleanBoolean
…………

每个基本数据类型都有对应的引用类型,而他们作为基本数据类型比较时和引用类型比较时又存在着一点点差异。

基本数据类型的比较

基本数据类型之间可以直接比较,返回值是boolean型的最常用的就是==比较运算符。

int a = 10;
int b = 20;
System.out.println(a==b);
//false
b = 10;
System.out.println(a==b);
//true

还有>,<,>=,<=!=这几种比较方法

int a = 20;
int b = 10;
System.out.println(a > b);
//true
System.out.println(a >= b);
//true
System.out.println(a != b);
//true

虽然基本数据类型我们已经使用不下上百次了,不过一些基本的引用数据类型也是需要理解和使用的。

引用数据类型的比较

引用类型也可以称之为对象,使用equal来比较对象的大小,在字符串中我们倒是经常使用。

String s1 = "hello";
String s2 = "hello";
//使用 == 来比较
System.out.println(s1 == s2);
//true
//使用 equsl 来比较
System.out.println(s1.equals(s1));
//true

可以惊奇的发现!他们结果居然一样!这个是因为内存中有一个字符串常量池,其中会存储我们一些常用的字符串,就像上面代码中的hello,在代码中如果需要这个字符串时,就相当于将这个字符串的地址引入过来,而使用==对地址进行比较,发现地址是相同的。也就会输出true.

String s1 = "hello";
//在内存中新开辟一块空间来存储 hello 字符串
String s2 = new String("hello");
//使用 == 来比较
System.out.println(s1 == s2);
//false
//使用 equsl 来比较
System.out.println(s1.equals(s1));
//true

新开辟的空间地址肯定和原来的地址不相同,所以这里会输出false

既然引用类型可以称之为对象,那么对于类对象之间的比较又是如何?

对象之间的比较

比如说对于一个猫咪的年龄进行比较是否可以直接使用比较运算符。

static class Cat {
    String desc;//猫的品种
    int age;//猫的年龄

    public Cat(String desc, int age) {
        this.desc = desc;
        this.age = age;
    }
}
public static void main(String[] args) {
    Cat cat1 = new Cat("波斯猫", 3);
    Cat cat2 = new Cat("短尾猫", 4);
    Cat cat3 = cat1;
    System.out.println(cat1 == cat2);//false
    System.out.println(cat1 == cat3);//true
}

比较两个对象的地址是否相等,对于cat1cat2,是不相等的,cat2是新的一个对象自然地址不一样,所以会输出false

cat3是等于cat1,表示这个指向cat1这个对象,所以在比较时自然会相等,所以输出true

不过这个代码并没有按我们的想法去比较两个猫的年龄,可以看出无法使用比较运算符来比较。

使用Equal覆写基类

已知所有数据类型都是继承至Object类,如果需要比较自定义类中的数据,使用equal可以用于比较两个对象是否相等。

static class Cat {
    String desc;//猫的品种
    int age;//猫的年龄

    public Cat(String desc, int age) {
        this.desc = desc;
        this.age = age;
    }
    //重写equals方法
    @Override
    public boolean equals(Object o){
        if(this == o){
            return true;
        }
        if(o == null || !(o instanceof Cat)){
            return false;
        }
        Cat c = (Cat)o;
        return age==c.age && desc == c.desc;
    }

自己与自己比较,然后返回一个对象之间是否相等的值。

使用Comparable接口类来比较

Comparable是JDK中提供的比较接口类,他可以用于比较泛型,也就是所有的数据类型,只需要你指定一个比较对象,这个比较器就会根据你提供的比较方法来比较两个数据。

使用Comparable中compareTo方法

在这里插入图片描述在这里插入图片描述

public class Test {
    static class Cat implements Comparable<Cat>{
        String desc;//猫的品种
        int age;//猫的年龄

        public Cat(String desc, int age) {
            this.desc = desc;
            this.age = age;
        }
        //比较年龄
        @Override
        public int compareTo(Cat o) {
            if(o==null){
                return 1;
            }
            return age - o.age;
        }
    }
    public static void main(String[] args) {
        Cat cat1 = new Cat("波斯猫", 3);
        Cat cat2 = new Cat("短尾猫", 4);
        if(cat1.compareTo(cat2)==0){
            System.out.println("一样大");
        }else if(cat1.compareTo(cat2) > 0){
            System.out.println("波斯猫大");
        }else {
            System.out.println("短尾猫大");
        }
    }
}
使用Comparator中Compare方法

源代码中compare。

在这里插入图片描述

static class ComparatorCat implements Comparator<Cat> {

     //比较年龄
    @Override
    public int compare(Cat o1, Cat o2) {
        return o1.age - o2.age;
    }
}
public static void main(String[] args) {
    Cat cat1 = new Cat("波斯猫", 3);
    Cat cat2 = new Cat("短尾猫", 4);
    ComparatorCat comparatorCat = new ComparatorCat();
    int compare = comparatorCat.compare(cat1, cat2);
    if(compare>0){
        System.out.println("波斯猫大");
    }else if(compare < 0){
        System.out.println("短尾猫大");
    }else {
        System.out.println("一样大");
    }
}

实现一个类实现这个比较器,创建对象来实现比较需要比较的数据。

引用类型之间三种比较方法之间的不同:

方法使用方法
Object.equals继承至Object,使用可以直接进行重写操作,只能比较相等,返回值Boolean
Comparable.compareTo需要手动实现接口,每次使用都会排序,存在内部顺序
Comparator.compare实现一个比较器,对类的侵入性弱,代码侵入性强
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基数据类型引用类型是编程语言中的两种不同的数据类型基本数据类型是简单的数据类型,它们的值直接存储在变量中。常见的基本数据类型有Number、String、Boolean、Null和Undefined。这些类型的值可以直接操作和访问。 引用类型是由对象组成的复杂数据类型,它们的值是保存在堆内存中的对象。引用类型包括Object、Array、Function、Date等。引用类型的值是对对象在内存中的引用,而不是实际的值。通过引用,我们可以访问和修改对象的属性和方法。 在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的。在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的,默认值是0。这意味着当我们将一个基本数据类型的变量作为参数传递给方法时,方法会获得该变量的副本,而不是直接引用它。因此,对于基本数据类型,每个变量都有自己的独立值。相反,引用类型的变量保存的是对象的引用,当将一个引用类型的变量作为参数传递给方法时,方法会获得该变量引用的对象。因此,对于引用类型,多个变量可以引用同一个对象,对一个变量的修改会影响其他引用该对象的变量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [JavaScript中基本数据类型和引用数据类型的区别](https://blog.csdn.net/weixin_42103706/article/details/83820246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [基本数据类型和引用数据类型](https://blog.csdn.net/m0_53881899/article/details/126001122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值