java equals和==的区别详解_java

 大概说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
, equals和==的区别
, equals和==
equals和==区别详解
java 和equals的区别、java equals 区别、c equals 详解、java equals、java equals方法,以便于您获取更多的相关知识。

时间: 2024-09-24 20:54:57

java equals和==的区别详解_java的相关文章

基于Java中字符串内存位置详解_java

前言 之前写过一篇关于JVM内存区域划分的文章,但是昨天接到蚂蚁金服的面试,问到JVM相关的内容,解释一下JVM的内存区域划分,这部分答得还不错,但是后来又问了Java里面String存放的位置,之前只记得String是一个不变的量,应该是要存放在常量池里面的,但是后来问到new一个String出来应该是放到哪里的,这个应该是放到堆里面的,后来又问到String的引用是放在什么地方的,当时傻逼的说也是放在堆里面的,现在总结一下:基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,

Java中Properties的使用详解_java

Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支 持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量设置.今天,我们就开始Properties的使用. Java中Properties的使用 Properties的文档说明: The Properties class represents a persistent set of propertie

Java静态方法不具有多态性详解_java

动态绑定机制使得基类的引用能够指向正确的子类对象,从而使得面向基类编程成为可能. 然而动态绑定在以下两种情况会失效. 1.基类方法是private或final修饰的 这个很好理解,因为private说明该方法对子类是不可见的,子类再写一个同名的方法并不是对父类方法进行复写(Override),而是重新生成一个新的方法,也就不存在多态的问题了.同理也可以解释final,因为方法同样是不可覆盖的. 2.方法是static修饰的 代码如下所示. class Base { public static v

Java中Hashtable类与HashMap类的区别详解_java

Hashtable类 Hashtable继承Map接口,实现一个key-value映射的哈希表.任何非空(non-null)的对象都可作为key或者value. 添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数. Hashtable通过initial capacity和load factor两个参数调整性能.通常缺省的load factor 0.75较好地实现了时间和空间的均衡.增大load factor可以节省空间但相应的查找时间将增大,

Java 23种设计模型详解_java

设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每

Java 中Map 的用法详解_java

Map简介 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口. Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序.某些映射实现可明确保证其顺序,如 TreeMap 类:另一些映射实现则不保证顺序,如HashMap 类. 注:将可变对象用作映射键时必须格外小心.当对

5种Java经典创建型模式详解_java

一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. (3)行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 二.设计模式的六大原则 1.开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修

Java中枚举的使用详解_java

枚举简介:  为什么要用枚举:     枚举是Java1.5出来之后新增的类型,它可以用来定义一组取值范围固定的的变量.     在枚举没有出来之前,要定义这样的变量,往往是通过定义一个接口,将不同的变量     使用不同的整数赋值.但是这样的却有着很明显的缺点:         1.不能保证其定义数值的合法性: 在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的&quo

HttpClient 在Java项目中的使用详解_java

Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性.因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入. 一.简介 HttpClient是Apache Jakarta Common下的子项目,用