== 和 equals 的区别是什么?

Posted baimh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了== 和 equals 的区别是什么?相关的知识,希望对你有一定的参考价值。

Java数据类型分为:

         基本数据类型

         复合数据类型(包装类是基本数据类型的引用类型也属于复合数据类型)

基本数据类型:

      byte,short,int,long,float,double,char,boolean 

复合数据类型:

       包装类:Byte ,Short,Integer,Long,Float,Double,Character,Boolean

       对象:var obj ="name":"xiaoming"

       数组: var objarr = ["1","2","3"]

       函数:function f()

转:https://blog.csdn.net/qq_35001600/article/details/82889515 

1)基本数据类型之间比较用 == 且比较值,而复合数据类型 == 比较的时候两对象的地址值是否一致,所以除非是同一个new出来的对象,结果为true,否则为false。

2)对于equals() 由于java中所有类都继承与Object基类,在Object类中定义了一个equals(),该方法初始化是比较对象的内存地址。

技术图片

但在一些类中重写了这个方法,如包装类String,Date等,equals()比较的是两个变量的值。

·String

创建String对象的两种方式比较他们的==和equals会有不同的效果

String s1=”sss”;

String s2=new String(“sss”);

System.out.println(s1.==s2);

System.out.println(s1.equals(s2));

输出结果:false

              true

研究这个结果就需要了解一下String对象的创建机制。

   

String s1=”sss”;这种创建方式在内存中的过程是在方法区的常量池中创建一个”sss”字面值 ,然后之后由这种创建方式的变量都由栈中指向这个地址,所以只要值一样,变量之间==为true;

而String s2=new String(“sss”);这种创建方式的过程具体是在堆中创建一个新的对象,所以在和值一样的变量比较==时为false,但是只要值一样的话.equals()还是为true的。

 

String中还有个特殊的地方就是使用+号拼接得到的结果如果值和某变量值一致,不代表两变量地址一致,如果拼接的是一个字面值,则指向同一个值的常量池地址,两变量地址一致。但如果拼接的是一个变量相当于新建了一个对象,地址指向堆,所以即使值一致,地址也不一样。

最后String中有个intern()方法。

 

这个方法的作用是在常量池中检查是否有和该字符串相同的值,如果有,则返回常量值,若没有就创建该常量值,并返回。所以通过intern()得到的值会和指向同一个常量池值的变量地址一致且值一致

针对String简单的总结一下:

①只要不新建对象,值相同地址一般相等

②String身为一个不可变值,对字符串的操作会新建一个对象。

③拼接时关注字符串是否新建对象

 

 

 

·包装类

当包装类和基本类型进行”==”比较时,包装类会自动拆箱为基本数据类型再进行比较。而字面值的地址都指向常量池,值相同地址相同。

两个相同包装类型的对象进行equals()比较时,equals()会先比较类型,如果类型相同再比较值,二者同时成立为true

两个基本类型没有equals()比较方法

包装类调用equals(),但是参数是基本类型,这时候会先进行自动装箱,基本类型转换为其包装类,先判断类型,再判断值,二者都成立时结果为true

以Integer为例讨论一下直接赋值的情况下两变量的==结果和equals()值:

例:Integer i1=123;

Integer i2=123;

System.out.println(i1==i2);

输出结果:true

因为Integer对象在编译期会自动拆箱(该特性在jdk1.5之后)。

例:Integer i1=200;

Integer i2=200;

System.out.println(i1==i2);

输出结果为:false

这个记过就很神奇,和上一个例子明明一样为什么结果不一样。这是因为Integer自动拆箱的过程:Integer i1=200在编译期会调用一个叫valueOf()的静态方法

 技术图片

 

由此可知,cache是一个数组,规定了整型在[-127,128]这个范围。超过这个范围的值就会在堆内存中创建一个新的对象,两对象地址不同。

针对Integer简单总结一下:

①无论如何Integer变量不会和新创建的对象相等。

②Integer在==比较时会在编译时期自动拆箱。

 

以上是关于== 和 equals 的区别是什么?的主要内容,如果未能解决你的问题,请参考以下文章

==和equals()的区别

== 和 equals 的区别是什么

关于equals()和==区别

== 和 equals 的区别是什么?

Java 中 hashCode 和 equals 方法是什么?它们和 == 各有什么区别?

== 和 equal 区别