精华内容
下载资源
问答
  • equals和==的区别
    2019-10-21 09:08:53

    equals和==的区别:

    == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

    1、比较的是操作符两端的操作数是否是同一个对象。
    2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
    3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,例如:
    int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。

    equals
      equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

    String s=“abce"是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。以String s=“abce”;形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"abcd”,下一次如果有String s1 = “abcd”;又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
      而String s = new String(“abcd”);和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。

    也可以这么理解: String str = “hello”; 先在内存中找是不是有"hello"这个对象,如果有,就让str指向那个"hello".如果内存里没有"hello",就创建一个新的对象保存"hello". String str=new String (“hello”) 就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"。

    可以参考下面的代码:
    public class test1 {
    public static void main(String[] args) {
    String a = new String(“ab”); // a 为一个引用
    String b = new String(“ab”); // b为另一个引用,对象的内容一样
    String aa = “ab”; // 放在常量池中
    String bb = “ab”; // 从常量池中查找
    if (aa == bb) // true
    System.out.println(“aa == bb”);
    if (a == b) // false,非同一对象
    System.out.println(“a==b”);
    if (a.equals(b)) // true
    System.out.println(“aEQb”);
    if (42 == 42.0) { // true
    System.out.println(“true”);
    }
    }
    }

    equals和==的区别
    equals方法最初是在所有类的基类Object中进行定义的,源码是
    public boolean equals(Object obj) {
    return (this == obj);
    }
      由equals的源码可以看出这里定义的equals与= =是等效的(Object类中的equals没什么区别),不同的原因就在于有些类(像String、Integer等类)对equals进行了重写,但是没有对equals进行重写的类(比如我们自己写的类)就只能从Object类中继承equals方法,其equals方法与= =就也是等效的,除非我们在此类中重写equals。

    对equals重新需要注意五点:

    1 自反性:对任意引用值X,x.equals(x)的返回值一定为true;
      2 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
      3 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true ;
      4 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变;
      5 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 。

    String类对equals的重写如下:

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

    另外,” == “比"equals"运行速度快,因为”=="只是比较引用。

    更多相关内容
  • 主要介绍了java 中equals和==的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • NULL 博文链接:https://jewel-m.iteye.com/blog/1220391
  • C#中判断两个对象是否相等有Equals、RefrenceEquals==三种,其中==为运算符,其它两个为方法,而Equals又有两种版本,一个是静态的,一个是虚拟的,虚拟的可以被实体类重写,静态的在方法体内也是调用虚拟的,如下...
  • 主要介绍了详解 Java 中 equals == 的区别的相关资料,equals == 都是用来检测两个字符串是否相等,返回值也都是布尔型,但是两者在内部比较的处理中却不尽相同需要的朋友可以参考下
  • equals == 的区别

    2021-05-30 10:26:02
    分析equals和== 的区别 现在大多数的人印象中equals和==的区别就是一个比较地址一个比较内容,之前我也是这么认为,但其实这么说是不准确的。 首先我们看一下Object中的equals方法,你会发现里面其实就只是进行了=...

    分析equals和== 的区别

    现在大多数的人印象中equals和==的区别就是一个比较地址一个比较内容,之前我也是这么认为,但其实这么说是不准确的。

    首先我们看一下Object中的equals方法,你会发现里面其实就只是进行了== 的判断。

    所以在Object中,equals里面实际就是用==做比较的。

    那么为什么对于Strign这种数据类型用== 和equals做比较有时候会得出不同的结果呢。于是我又看了String里面的equals方法。

    很明显这个方法的判断比Object里面的判断要复杂的多,先是用==做了比较,为false则比较String 的长度,最后再吧字符串拆开成char一个个的进行比较。

    解释这种差异,要先从数据类型说起,大家都知道java中的数据类型分为两种,基本数据类型和引用数据类型。

    这两种数据类型储存的方式是不一样的,如下图

    基本数据类型是直接存在栈空间的,而引用数据类型是分开存储,栈空间存的是地址,具体的值是存在地址对应的堆空间中。

    我们用 == 做比较的时候,其实比较的是栈空间里面的东西,所以基本数据类型用  == 是可以的。

    但是引用数据类型使用==做比较的时候,就会出现一个情况,如上图的String b 和Strign c ,从外面的视角看上去两个字符串都是“1111111”,但是因为两个字符串的地址不一样,一个是 xxxxx一个是mmmm,所以会返回false。

    这就是为什么String这种引用数据类型不能使用==的原因了,那么我们看回String中的equals方法。

    能看到是做了两次比较,第一次是使用 == 为true直接返回true ,这一个是判断两个字符串的地址是否一样,如果地址都一样了,那么这两个是指向了同一个堆空间。

    返回false 则进行下面的判断,判断长度和里面的每一个字符。

    这样看,equals和== 的区别就很明显了。

    总结一下  : 在Object中equals 方法是直接进行了== 判断,只不过对于Object下面的对象,都是重写了这个equals方法,里面是做了自己的判断逻辑而不是简单的比较堆空间的值,甚至你可以写一个 return true;不过这会被大佬喷。

    好了 大概就这样。

     

     

    展开全文
  • Java中equals和==的区别

    2020-04-22 15:56:59
    在Java学习面试中经常遇到这个问题,虽然想着简单,但还是决定记录下来,毕竟菜嘛...... ==: ==是直接比较的两个对象的堆内存地址,如果相等,则说明这两个引用实际是指向同一个对象地址的。但是我们又常常碰到...

    在Java学习和面试中经常遇到这个问题,虽然想着简单,但还是决定记录下来,毕竟菜嘛......
    ==:

    ==是直接比较的两个对象的堆内存地址,如果相等,则说明这两个引用实际是指向同一个对象地址的。但是我们又常常碰到这样一个问题

    最终结果是true,true,那既然==是比较的地址,那么int数据的地址是怎样的呢,String又是怎样的呢?

    对于基本数据类型(byte,short,char,int,float,double,long,boolean)来说,他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 "123" 也是相同的道理,在常量池中,一个常量只会对应一个地址,因此不管是再多的 123,"123" 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过==来直接比较的。

    另外,对于基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long,  Boolean)除了Float和Double之外,其他的六种都是实现了常量池的,因此对于这些数据类型而言,一般我们也可以直接通过==来判断是否相等。那么再出一个问题考考大家 ↓

    猜猜看,结果是啥?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

     

    结果是true,false。没想到吧!其实是因为 Integer 在常量池中的存储范围为[-128,127],127在这范围内,因此是直接存储于常量池的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以m,n分别指向了两个不同的对象地址,故而导致了不相等。
    equals方法:

    之前在网上也搜了很多相关的问题,但给出的答案却不尽人意,很多网友都说equals比较的是对象的内容,这样的说法是不准确的。首先我们来看看在Object类中定义的equals方法

    可以看到,在Object类型的equals方法是直接通过==来比较的,和==是没有任何区别的。

    那么为什么又要说equlas和==的区别呢?是因为equals方法是可以由我们自己重写的。

    众所周知,我们所有的类都直接或间接地继承自java.lang.Object类,因此我们可以通过重写equals方法来实现我们自己想要的比较方法。来看看eclipse为我们自动生成的equals方法 ↓

    可以看出,eclipse还是很智能的,它首先是判断两个对象的地址是否相等,若不相等再进行下面的成员变量判断。

    但这个方法体是完全可以由我们自己实现的,即便是我们直接 return true 都是可以的,只要能满足我们的业务需求,怎样写都是无所谓的,因此,equals比较的并不一定是对象的内容,它还可以由其他的信息来指导比较。

    文中不当之处欢迎大佬们指教或提出异议。
     

    展开全文
  • 优美的讲解equals和==的区别

    万次阅读 多人点赞 2018-06-02 18:49:44
    初步了解在JVM中的内存分配知识 在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟...初步认识equals与==的区别: ==是判断两个变量或实...
    初步了解在JVM中的内存分配知识

            在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用。还需注意的一点,基本数据类型是存储在栈内存中。

    初步认识equals与==的区别:

    1.  ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 
    2. ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
    3. ==指引用是否相同, equals()指的是值是否相同
     用一张图可以简要的表现他们之间的关系:



    代码测试一:


    equals与==的区别详解:

            == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。String s="abcd"是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。以String s="abcd";形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。 这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象, 如果没有,则在常量池中新创建一个"abcd",下一次如果有String s1 = "abcd";又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
       而String s = new String("abcd");和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。
    也可以这么理解: String str = "hello"; 先在内存中找是不是有"hello"这个对象,如果有,就让str指向那个"hello".

    如果内存里没有"hello",就创建一个新的对象保存"hello". String str=new String ("hello") 就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"。

    代码测试二:


            

    展开全文
  • ==是一个比较运算符 ...equals是Object类中的方法 (4)equals:只能判断引用类型 (5)默认判断地址是否相等,子类中往往重写了该方法(后面结合源码分析),用于判断内容是否相等,比如Integer,String
  • equals与==的区别

    千次阅读 2020-05-18 10:41:18
    1、equals():equals是Object中的方法,在Object中equals方法实际"ruturn (this==obj)",用到的还是"==",说明如果对象不重写equals方法,实际该对象的equals和"=="作用是一样的,都是比较的地址值(因为"=="比较的...
  • 面试题 equals和==的区别

    万次阅读 多人点赞 2020-11-18 21:26:49
    equals和==的区别? 问这个可以说是老生常谈了 在java中,equals和 == ** 的最大区别就是 (==)他是运算符**,当然,你又会说他们不都有比较值的作用啊,做笔试题经常考 具体情况是下面这些 java中的基本数据类型...
  • 本文中详细的阐述了Java中经常遇到的equals、hashcode以及“==”号三者之间的区别
  • 面试:equals和==的区别

    千次阅读 2021-03-18 20:40:15
    equals和==的区别 一、对象类型不同 1、equals():是超类Object中的方法。 2、==:是操作符。 二、比较的对象不同 1、equals():用来检测两个对象是否相等,即两个对象的内容是否相等。 2、==:用于比较引用比较...
  • Java中equals和== 区别

    2021-04-23 10:07:36
    Java中equals和==的区别值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在...
  • 面试题:请说一下equals和==的区别

    热门讨论 2021-01-17 21:36:09
    equals比较的是两个对象值是否相等,如果没有被重写,比较的是对象的引用地址是否相同; ==用于比较基本数据类型的值是否相等,或比较两个对象的引用地址是否相等; String helloword= new String("helloword"); ...
  • Objects.equals和==的区别

    2021-09-17 13:32:55
    Objects.equals和==的区别 代码演示 我们先来演示一下,然后再说原理 package com.daylywork.study; import java.util.Objects; public class MyEquals { public static void main(String[] args){ String a=...
  • 主要给大家介绍了关于Java中equals与==的用法和区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Equals ==的区别 公共变量属性的区别 总结一下。
  • equals和==

    万次阅读 多人点赞 2019-03-25 19:48:32
    【声明】 欢迎转载,但请保留文章原始出处→_→ ...平时在学AndroidJava语言的时候,总是碰到“equals“==”这两个字符,老感觉差不多;其实还是有一些区别的,今天干脆把它们彻底弄清楚...
  • 主要介绍了java equals和=,==的区别,学习Java的朋友对equals == 这个概念开始使用的时候会有疑问,很难辨别如何正确使用,这里帮大家详细讲解该知识点,希望大家能掌握,有需要的小伙伴可以参考下
  • equals和==区别

    千次阅读 多人点赞 2019-10-11 20:00:43
    equals"=="区别 1、equals:  引用类型:Objec类比较的是地址值,但是继承他的类大都重写了equals方法比较成员变量的值是否相同,即比较的是是否是同一个对象。  基本类型:equals方法不能作用于基本...
  • 主要介绍了java equals和==的区别详解的相关资料,需要的朋友可以参考下
  • 关于== 对于基本类型引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; ...equals 本质上就是 ==,只不过 String Integer 等重写了 equals 方法,把它变成了值比较
  • C#中 equals与==的区别

    2019-11-21 11:05:48
    C# equals与==的区别 对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。 对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。 对于string 类型,== 比较字符串...
  • java中equals和==区别

    2020-06-05 22:20:32
    * equals和==区别 * 功能不同 "=="是判断两个变量或实例是不是指向同一个内存空间。 "equals"是判断两个变量或实例所指向的内存空间的值是不是相同。 定义不同 "equals"在JAVA中是一个方法,在Object中定义的。...
  • = = :运算符 可以使用在基本数据类型变量引用数据类型变量中 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同) ...说明:Object类中定义的equals()**==*
  • equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==...
  • equals和==的区别讲解

    2019-10-04 00:59:01
    3.equals和==的区别 equals方法最初是在所有类的基类Object中进行定义的,源码是 public boolean equals ( Object obj ) { return ( this == obj ) ; } 由equals的源码可以看出这里定义的...
  • java中equals和==的区别

    2011-04-15 15:30:48
    能够加强对java中equals与==区别的理解。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 231,736
精华内容 92,694
关键字:

equals和==的区别