java equals和==的区别详解

所属分类: 软件编程 / java 阅读数: 38
收藏 0 赞 0 分享

 大概说equals和==都比较的是什么:

  1. boolean tem = a == b;

  首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容。因为栈是用来存放地址或是java中八大基本类型中自动变量的字面值(自动变量就是用int a = 1;这种形式来定义的变量)。如果是自动变量比较值的话肯定是用==来比较,因为equals()是一个方法,所以必须由对象调用才可以用于比较。而自动变量既不是类的实例也不是类的引用所以不能用equals()方法。

  2.boolean tem = a.equals("b");

  equals()方法一般用于比较的是对象的内容但是也有的情况下也会去比较两个对象的地址。

  接下来

  写一个测试程序

package com;

import java.util.Date;

public class test {
  public static void main(String[] args) {
    Integer integer1 = new Integer(1);
    Integer integer2 = new Integer(1);
    String str1 = new String("123");
    String str2 = new String("123");
    Date date1 = new Date();
    Date date2 = new Date();
    Double double1 = new Double("1.0");
    Double double2 = new Double("1.0");
    Boolean tem1 = new Boolean(true);
    Boolean tem2 = new Boolean(true);
    Object object1 = new Object();
    Object object2 = new Object();

    System.out.println("----Object------");
    System.out.println(object1.equals(object2));
    System.out.println(object1 == object2);
    System.out.println(object1.equals(object1));
    System.out.println(object1 == object1);
    System.out.println("----Boolean------");
    System.out.println(tem1.equals(tem2));
    System.out.println(tem1 == tem2);
    System.out.println("----Double------");
    System.out.println(double1.equals(double2));
    System.out.println(double1 == double2);
    System.out.println("----Integer------");
    System.out.println(integer1.equals(integer2));
    System.out.println(integer1 == integer2);
    System.out.println("----String------");
    System.out.println(str1.equals(str2));
    System.out.println(str1 == str2);
    System.out.println("----Date------");
    System.out.println(date1.equals(date2));
    System.out.println(date1 == date2);
  }
}
 

 结果:

----Object------
false
false
true
true
----Boolean------
true
false
----Double------
true
false
----Integer------
true
false
----String------
true
false
----Date------
true
false

  首先对Object的比较,当比较的两个对象一样时,==和equals()的结果都是true,当两个对象不一样时返回的都是false。所以在==和equals用于比较对象时,他们比较的都是对象的地址,其实本质是一样的。下面是Object类中equals()方法的代码:

  public boolean equals(Object obj) {
    return (this == obj);
  }
  

  而对于Boolean,Double(Float同理),Interger(Shot,Long同理),String,Date我也找了他们的源码,下面我依次贴出来在Boolean,Double,Interger,String,Date这些类中equals()方法的源码,这时候equals()方法就被重写了,因为这些类都是继承于Object类的嘛。

  Boolean:

public boolean equals(Object obj) {
    if (obj instanceof Boolean) {
      return value == ((Boolean)obj).booleanValue();
    }
    return false;
  }

  Double:

public boolean equals(Object obj) {
    return (obj instanceof Double)
        && (doubleToLongBits(((Double)obj).value) ==
           doubleToLongBits(value));
  }

  Interger:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
      return value == ((Integer)obj).intValue();
    }
    return false;
  }

  String:

public boolean equals(Object anObject) {
    if (this == anObject) {
      return true;
    }
    if (anObject instanceof String) {
      String anotherString = (String) anObject;
      int n = value.length;
      if (n == anotherString.value.length) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = 0;
        while (n-- != 0) {
          if (v1[i] != v2[i])
              return false;
          i++;
        }
        return true;
      }
    }
    return false;
  }

  Date:

public boolean equals(Object obj) {
    return obj instanceof Date && getTime() == ((Date) obj).getTime();
  }

  也就是说在这些时候重写了Object类的equals()方法用于比较两个对象实际的内容而不再是地址了,当然肯定不只是这些,这里只是举出了几个比较常见的java原生类重写Object类的equals()方法的情况。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多