java中如何区分==和equals

网上搜了一遍,对于==和equals的表达感觉不全面;总感觉缺点什么;今天把这个比较总结出来三条规律。

结论1.基本类型没有equals方法,只有==比较,比较的是值。

结论2.所有对象的==比较都是内存地址的比较

(上面的两点简单不介绍了)

首先我们看Integer类的比较。

  Integer a=1000;
  Integer b=1000;
  System.out.println(a == b);//false
  System.out.println(a.equals(b));//true 

因为a和b都是对象类型,所以都有自己的堆内存地址,所以根据结论2得出a==b是false。

至于equals我们看一下源码

很明显Integer的equals比较的是值。所以网上有些说法:equals比较的是内存地址的说法是以偏概全的;这个equals的比较要根据当前类的equals的实现。

所以a.equals(b)是值的比较。

   Integer a1=127;
   Integer a2=127;
   System.out.println(a1 == a2);//true
   System.out.println(a1.equals(a2));//true

第三行a1==a2又变成了true;这个似乎违背了结论2.看看源码吧

private static class IntegerCache {
  static final int low = -128;
  static final int high;
  static final Integer cache[];

  static {
   // high value may be configured by property
   int h = 127;
   String integerCacheHighPropValue =
    sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
   if (integerCacheHighPropValue != null) {
    try {
     int i = parseInt(integerCacheHighPropValue);
     i = Math.max(i, 127);
     // Maximum array size is Integer.MAX_VALUE
     h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
    } catch( NumberFormatException nfe) {
     // If the property cannot be parsed into an int, ignore it.
    }
   }
   high = h;

   cache = new Integer[(high - low) + 1];
   int j = low;
   for(int k = 0; k < cache.length; k++)
    cache[k] = new Integer(j++);

   // range [-128, 127] must be interned (JLS7 5.1.7)
   assert IntegerCache.high >= 127;
  }

  private IntegerCache() {}
 }

Integer里面有一个静态的IntergerCache类,里面有一个static静态代码块和一个存放Integer的数组cache[].

上面代码意思是:从jvm中取high值,如果有值的话和127比较取最大值,没有值的话用127作为最大值。

-128作为最小值。所以cache[]数组的值是从-128~127并且是包装类型。

回到上面a1==a2的问题为什么是true的问题。

因为a1和a2的值是127在整型的缓存里面,所以a1,a2指向的对象都是缓存里面的对象,所以a1==a2比较的依然是引用,只不过他们的引用都一样而已。

如果超过缓存的范围,就需要重新new了,就会出现新的对象,自然引用就不一样了;所以a1==a2=1000的包装类是false.

顺便看了一下整型其他包装类(Byte,Short,Long)的源码,范围都是-128~127,并且不可设置的。

Boolean同样适合上面结论1和结论2.

Float的equals比较:

equals比较的是数值的二进制直接转换成int型的值比较

Double的equals比较:

equals比较的是数值的二进制直接转换成long型的值比较

至于我们自定义的类,比如定义一个Student类,其实它们都是调用Object的equals方法。

比较的是对象的引用,也就是内存地址的比较。

package a;

public class Student {
 static class A{
  @Override
  public boolean equals(Object obj) {
   return true;
  }
 }
 static class B{

 }

 public static void main(String[] args) {
  A a=new A();
  System.out.println(a.equals(new B()));
 }
}

上面对内部类的A方法重新了equals方法,总是返回true;那么传入任何对象比较,都会是相等的。

结论3:自定义对象的equals比较方式取决于equals方法;如果没有重写,比较的就是引用;

如果进行了重写,那么比较规则取决于equals体。

以上就是java中如何区分==和equals的详细内容,更多关于JAVA ==和equals的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java中==符号与equals()的使用详解(测试两个变量是否相等)

    Java 程序中测试两个变量是否相等有两种方式:一种是利用 == 运算符,另一种是利用equals()方法. 当使用 == 来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就返回true. 但是对于两个引用类型变量,只有它们指向同一个对象时, == 判断才会返回true. == 不可用于比较类型上没有父子关系的两个对象. 很多书上说equals()方法是判断两个对象的值相等.这种说法不准确.实际上equals()方法是O

  • java equals和==的区别详解

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

  • 浅谈java字符串比较到底应该用==还是equals

    当用new String("aaaa")对字符串做定义时,==会返回false,equals可以返回正常结果. 比如 System.out.println("a" == "a"); //true System.out.println("a".equals("a")); //true System.out.println("a".equals(new String("a"

  • Java中比较运算符compareTo()、equals()与==的区别及应用总结

    前言 比较运算符用于判断两个数据的大小,例如:大于.等于.不等于.比较的结果是一个布尔值( true 或 false ). Java 中常用的比较运算符如下表所示: 本文主要给大家介绍了关于Java比较运算符compareTo().equals()与==区别及应用的相关内容,下面话不多说了,来一起看看详细的介绍吧 1.== 和 equals的区别: ==主要是两个变量值的比较,返回值为true 或者是false.对于普通变量,如:int a=10; int  b= 10; a==b,返回为 tr

  • 如何区分JAVA中的equals与==

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型. byte,short,char,int,long,float,double,boolean  他们之间的比较,应用双等号(==),比较的是他们的值. 基本数据类型比较 == 和 Equals 两者都是比较值:equals()与==都是java中用于进行比较的,返回boolean值,不同的是equals()是Object类中定义的一个方法,==是一个比较运算符.下面是equals()在Object中的源码: public b

  • Java中equals与==的用法和区别

    背景介绍 == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断. java中的数据类型可以分为两类: 基本数据类型 byte,short,char,int,l

  • java基础之 “==”与“equals”区别详解

    对于初学java的人来说,在面对数值比较的时候,我们大多数会采用 "=="的方式来进行比较,但是java中给我们提供了equals()方法,这时候很多人就会忽略这两种方式的区别,在学习中产生了很多错误,本文将详细区分equals和 == 两种方式的区别. "==" 解读 对于基本类型和引用类型,==的作用效果是不同的,对于 基本类型 来说,比较的是值是否相同,对于 引用类型 来说,比较的是引用是否相同. 代码示例: public static void main(S

  • java中如何区分==和equals

    网上搜了一遍,对于==和equals的表达感觉不全面:总感觉缺点什么:今天把这个比较总结出来三条规律. 结论1.基本类型没有equals方法,只有==比较,比较的是值. 结论2.所有对象的==比较都是内存地址的比较 (上面的两点简单不介绍了) 首先我们看Integer类的比较. Integer a=1000; Integer b=1000; System.out.println(a == b);//false System.out.println(a.equals(b));//true 因为a和

  • 详解java中保持compareTo和equals同步

    详解java中保持compareTo和equals同步 摘要 : 介绍重写equlas()和comparable接口,两者进行不相同的判断.从而使两者的对应的list.indexOf()与 Collections.binarySearch()得到的不一样. 在Java中我们常使用Comparable接口来实现排序,其中compareTo是实现该接口方法.我们知道compareTo返回0表示两个对象相等,返回正数表示大于,返回负数表示小于.同时我们也知道equals也可以判断两个对象是否相等,那么

  • Java中如何正确重写equals方法

    目录 1. 什么是equals方法? 1.1 equals方法: 2. 为什么要重写equals方法? 2.1 举个例子吧~ 3. 分析equals源码: 4. 正确重写equals方法: 重写equals方法的正确打开方式 正文开始@Assassin 1. 什么是equals方法? 我们首先得知道,Object类是 Java中所有类的父类(超类/基类),也就是说,在Java中,所有的类都是默认继承自Object类的,换言之,Object类中所实现的方法我们都可以直接拿来用.而equals方法便

  • java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是Object.equals方法了.但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了. 也就是说,如果集合中现在已经有

  • Java中判断对象是否相等的equals()方法使用教程

    Object类中的equals方法用于检测一个对象是否等于另一个对象.在Object类中,这个方法判断两个对象是否具有相同的引用,如果两个对象具有相同的引用,它们一定是相等的.从这点上看,将其作为默认操作也是合乎情理的.然而,对于多数类类说,这种判断并没有什么意义,例如,采用这种方式比较两个PrintStream是否相等就完全没有意义.然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的.所以一般在自定义类中都要重写equals比较. 下面给出编写一个完美eq

  • java中hashCode、equals的使用方法教程

    前言 众所周知Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色.在一些类中重写这两个方法以完成某些重要功能. 1.为什么要用 hashCode()? 集合Set中的元素是无序且不可重复的,那判断两个元素是否重复的依据是什么呢? 有人说:比较对象是否相等当然用Object.equal()了.但是,Set中存在大量对象,后添加到集合Set中的对象元素比较次数会逐渐增多,大大降低了程序运行效率. Java中采用哈希算法(

  • Java中Lambda表达式之Lambda语法与作用域解析

    接上一篇:初探Lambda表达式/Java多核编程[2]并行与组合行为 本节是第二章开篇,前一章已经浅显地将所有新概念点到,书中剩下的部分将对这些概念做一个基础知识的补充与深入探讨实践. 本章将介绍Lambda表达式基础知识. 前言 把上一张书中的结语放到这里作为本章学习内容的开头,以此来概括Lambda表达式的优点: 提升性能.自动的并行化 更棒的API(comparing(...)细粒度的方法将成为标准) 编码风格得到改进.代码简化 反观前面几篇文章中的代码实践,以上三个优点全部得到了验证.

  • java中有无参数和返回值的方法详解

    目录 java有无参数和返回值 以下的例子要细细查看 方法的返回值和参数 1.返回值 2.参数 java有无参数和返回值 首先,定义一个土豪类(LocalTyrant) 属性:name moeney smoke 行为一:(无参数无返回值): 行为二:(无参数有返回值): 行为三:(有参数有返回值): 行为四:(有参数无返回值): 以下的例子要细细查看 慢慢分析,切不可急于求成 package cm.tr; class LocalTyrant{ String name; int money; St

  • 探索Java中的equals()和hashCode()方法_动力节点Java学院整理

    equals()和hashCode()区别?  equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值.  hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数.根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的:当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了. 之所以有hashCode方法,是因为在批量的对象比

随机推荐