Java变量比较

    很多时候我们都需要对两个变量进行比较,判断它们是否相等。不用性质的变量的比较方法会有所不同,其比较的含义也不尽相同,本文将讨论一下基本数据类型变量、引用变量和对象变量的比较方法和意义。

一、primitive基本数据类型比较

    用==比较基本数据类型的变量,当变量的值相等时,则认为这两个变量相等。即使是不同类型的变量,只要它们的值相等,就认为它们相等。

    int a = 1;
    int b = 2;
    float c = 1.0f;


    boolean result1 = (a == b);//false
    boolean result2 = (a == c);//true

二、引用比较

    用==比较两个引用是否指向堆上的同一个对象。其实引用也是个变量值,只是这个值是取得特定对象的位表示法,可以类比成这个对象的访问地址。用==比较两个引用其实就是判断这两个引用是不是指向内存里的同一个东西。

    public class Person {
        private String name;
        private int age;


        public Person(String name,int age){
            this.name = name;
            this.age = age;
        }


        public String getName() {
            return name;
        }


        public void setName(String name) {
            this.name = name;
        }


        public int getAge() {
            return age;
        }


        public void setAge(int age) {
            this.age = age;
        }
    }

    Person p1 = new Person("p1",20);
    Person p2 = new Person("p1",20);
    Person p3 = p1;

    boolean result3 = (p1 == p2);//false
    boolean result4 = (p1 == p3);//true

三、对象的比较

    用equals()方法比较两个对象在某种意义上是否相等。在没有重写equals()方法的默认情况下,比较的依然是这两个对象是不是堆上的同一个对象。

    Person p1 = new Person("p1",20);
    Person p2 = new Person("p1",20);
    Person p3 = p1;
    boolean result5 = (p1.equals(p2));//false
    boolean result6 = (p1.equals(p3));//true

    但很多情况下,我们是想比较两个对象是否具有相同的属性,而就此判断它们是不是相等,此时就需要重写equals()方法。

    @Override
    public boolean equals(Object obj) {
        if(obj == null){
            return false;//1
        }


        if(this == obj){
            return true;//2
        }


        if(obj instanceof Person){
            Person temp = (Person)obj;
            if(this.name.equals(temp.getName()) && this.age == temp.age){
                return true;//3
            }else {
                return false;//4
            }
        }else {
            return false;//5
        }
    }


    Person p1 = new Person("p1",20);
    Person p2 = new Person("p1",20);
    Person p3 = p1;
    Person p4 = new Person("p4",20);


    boolean result7 = (p1.equals(null));//false,在1处返回     
    boolean result8 = (p1.equals(p3));//true,在2处返回     
    boolean result9 = (p1.equals(p2));//true,在3处返回     
    boolean result10 = (p1.equals(p4));//false,在4处返回     
    boolean result11 = (p1.equals(new Integer(1)));//false,在5处返回 

    至此,对象的比较已基本完成。但是,我们需要注意到:如果以我们重写的规则来判断两个对象是相等的,那么这两个对象就应该满足某些操作规则,例如在HashSet中就不应该出现两个重复的对象,而HashSet判断两个对象是否重复不仅需要调用equals()方法,同时还会调用hashCode()方法以判断两个对象的HashCode是否相等。因此,我们在重写了equals()方法同时,也应该重写hashCode()方法,以使得相等的两个对象具有相同的HashCode。

    @Override
    public int hashCode() {
         TODO: 重新计算HashCode,使得满足equals()方法的对象拥有相等的哈希值
        //简单的测试例子:
        return this.name.length() + this.age;
    }

    HashCode是对象的int型的散列码,用于支持哈希机制的集合类操作,通常是根据对象的地址或字符或数值计算得到的,大多数情况下不同对象的HashCode是不相等的,但也有巧合的情况是相等的,此时就不能直接认为两个对象也相等。
    结论:(1)重新了equals()方法的同时也应该重新hashCode()方法,即符合“相等的两个对象具有相同的HashCode”;(2)HashCode相等并不意味着两个对象是相等。
### 回答1: 可以使用双等号(==)来判断两个变量是否相等,例如: if [ "$var1" == "$var2" ]; then echo "两个变量相等" else echo "两个变量不相等" fi 其中,$var1和$var2是要比较两个变量。注意,双等号两边要有空格,否则会报错。 ### 回答2: 在shell中,判断两个变量是否相等可以使用以下几种方法: 1. 使用双等号(==)进行比较: ``` if [ $var1 == $var2 ]; then echo "两个变量相等" else echo "两个变量不相等" fi ``` 2. 使用等号加方括号(=)进行比较: ``` if [ $var1 = $var2 ]; then echo "两个变量相等" else echo "两个变量不相等" fi ``` 3. 使用test命令进行比较: ``` if test $var1 = $var2; then echo "两个变量相等" else echo "两个变量不相等" fi ``` 以上三种方法都可以用于判断两个变量是否相等,其中双等号(==)也可以使用单等号(=)代替,但是单等号在某些特殊情况下可能会有问题,因此推荐使用双等号。 注意,在if语句中的两个变量之间需要有空格,否则会导致语法错误。另外,变量比较时,可以使用双引号将变量括起来,以防止变量值中包含特殊字符导致错误判断。 ### 回答3: 在Shell脚本中,我们可以使用if语句来判断两个变量是否相等。具体实现方式如下: ```shell #!/bin/bash # 定义两个变量 var1="hello" var2="world" # 判断两个变量是否相等 if [ "$var1" = "$var2" ]; then echo "两个变量相等" else echo "两个变量不相等" fi ``` 在上述示例中,我们使用了`if [ "$var1" = "$var2" ]`来判断两个变量`var1`和`var2`是否相等。如果相等,则输出`"两个变量相等"`,否则输出`"两个变量不相等"`。 需要注意的是,`=`是用来判断字符串是否相等的操作符。对于数字的比较,可以使用`-eq`、`-gt`、`-lt`等操作符。 希望以上回答对您有帮助,如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值