== 和 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 的区别是什么?的主要内容,如果未能解决你的问题,请参考以下文章