关于Java中“==”运算符和equals()方法以及重写equals()方法的总结

一:当比较对象是基本类型变量(且都是数值型的,不要求数据类型严格相同)。用“==”运算符来比较两个对象是否相等的时候,不用管其他的,只要两个对象的值相等,那么返回值一定是true。

            int i=65;
        	float j=65.0f;
        	char ch='A';
        	System.out.println("65和65.0f是否相等?"+(i==j));
        	System.out.println("65和'A'是否相等?"+(i==ch));
        	System.out.println("65.0f和'A'是否相等"+(j==ch));

所以上述的三个输出都是“true”。因为他们值都是一样的。
注意:当比较对象是基本类型变量时候不可用equals()方法,这个书里没有具体说,但是我运行的时候会报错。
二:当比较对象是引用类型变量时。其实引用类型变量也可以分别两种。一种是字符串(因为Java中字符串也是一种对象,它是String类的对象),还有一种就是普通的类的对象,这里先说当比较对象是字符串的情况。
1.当比较对象是字符串时候用“==”运算符 (必须是指向同一个对象才是true,即使不同对象,但是内容一样,同样也是false)

        String str1="hello";
        String str2="hello";
        String str3=new String("hello");
        String str4=new String("hello");
        String str5=new String();
        String str6=new String();
        String str7="hello"+"hello";
        String str8="hello"+"hello";
        String str9="hello"+str3;
        String str10="hello"+str3;
        System.out.println(str1==str2);//true
        System.out.println(str2==str3);//false
        System.out.println(str3==str4);//false
        System.out.println(str4==str1);//false
        System.out.println(str5==str6);//false
        System.out.println(str7==str8);//true
        System.out.println(str9==str10);//false
        System.out.println(str7==str9);//false

结果解释:首先来解释一下直接量的含义
(1)直接量(包括可以在编译时就计算出来的字符串量)。str1,str2,str7,str8都是直接量。JVM将会使用常量池来管理这些字符串。但是当利用new String(“hello”)创建对象时,JVM会先使用常量池来管理“hello”直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存里。换句话说,new String (“hello”)一共产生了两个字符串对象。
(2)注意:JVM常量池保证相同的字符串直接量只有一个,例子中。str1,str2,str7,str8所引用的字符串在编译期就确定下来了,多次出现时会被编译器优化,只创建一个对象。所以用“==”运算符时,如果面对的是直接量,那么只看内容,内容相等就是true。(其实这种情况下也算是必须指向同一个对象才是true。因为直接量内容相同的话,只创建一个对象,原因上面解释了)
(3)str3,str4,str5,str6都是false这个很好解释,只要用到了new就是创建了新的对象,那指向的指定不是同一个对象了,所以是false。
(4)至于str9,str10。由于他们都用到str3(是一个对象),str3不能在编译的时候就确定下来,而是在运行的时候才知道。所以像str9,str10以及用new创建的对象都是在运行的时候才创建出来的,它被保存在运行时内存区(堆内存),不会放入常量池中。所以str9,str10也是相当于新创建的对象(即便他们的值相同,所以是false)
2、当比较对象是字符串时候,用到equals()时候,只要内容一样,无论什么情况都是true。
所以str7,str8,str9,str10任两个用到equals()方法时候都是true

        System.out.println(str7.equals(str8));
        System.out.println(str8.equals(str9));
        System.out.println(str9.equals(str10));
        System.out.println(str10.equals(str7));

三、当比较对象是类对象的时候
1、在java中有两种相等。第一种是判断两个对象是不是指向同一个地址区域(也就是说这两个对象是不是同一个对象),这就直接对应equals()函数。此时“==”和equals()的作用是一样的。都是判断是不是指向同一个对象。
例如:

Dog dog1 =new Dog();
Dog dog2 =new Dog();
dog1.equals(dog2)
//结果是false,因为是创建了两个新的对象,那么就是开辟了两个不同的内存,所以指向不同的地址,所以一定是不同的

dog1==dog2//同样地,利用“==”也是比较是否是指向同一片区域,所以结果也是不同的
注意:即使给他们的属性都赋值一样的话,结果仍然是不同的。

(2)第二种相等的意思就是这两个对象的属性值都一样,这就要用到equals()方法的重写。
equals()方法的重写如下:

public boolean equals(Object obj)
{
   if(this==obj)//首先判断是不是指向同一片区域,同一个地址对象,如果是一个的话那指定是相同的。
       return true;
   if(obj==null)//如果其中一个是空的话,那么一定是不同的
      return false;
   if(getClass()!=obj.getClass())//getClass()的方法是获取“类对象”。“类对象”是描述这个类的代码信息,属性名,方法名,更关注代码信息。而“类的对象”更关注的是数据信息。所以“类对象”是获得类型,若是两个类连类型都不同,那指定不同了
      return false;
   Dog other=(Dog)obj;//两个对象类型相同时候,再把要比较的对象转换成原对象的类型
   if(age!=other.age) //类型相同,在进行属性比较。
      return false;
   retuen true;
}
```、
注意:equals()方法的重写里面判断相同的条件是可以根据客户与实际业务以及类内的属性值进行改变的。也就是说举个例子,重写后的equals()方法里面可以什么都没有,这个时候也就是永远都是相等的。所以不同类也可以相等,当然这样是没有意义的,一般不会这样使用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值