== 和 equals 差异

面试过程中常常会被问到的一个问题是:==和equals的差异是什么

== 作用

  • 基本数据类型:比较是否相等
  • 引证数据类型:判别引证是否指向堆内存的同一块地址

equals: Object类中的一个方法,用于判别两个变量是不是对同一个目标的引证,即中的内容是否相同;String类型对这个方法进行了重写,用于比较两个字符串内容是否相同

看下这个比如,

String queryType = "1";
String queryType = new String("1");

运用上述两种方法界说了一个字符串目标,当运用 == 判别queryType的值是否为”1″,得到的结果是不同的,为什么会这样呢?

== 和 equals 区别

== 和 equals 区别

== 和 equals 区别

== 和 equals 区别

需求重复的一个事实是:== 在比较引证数据类型时,会判别目标的引证地址是否相同

当比较String类目标时,一个问题是,目标的内容相同,也便是字符串的值相同,不代表目标相同,即指向同一个内存地址。

所以上方问题可以转换为实例化String两种方法,有什么差异?

String queryType = "1";
String queryType = new String ("1");
  • 存储方位不同:String queryType = “1” ,存储在常量存储区的字符常量池中;new String (“1”),存储在堆中。
  • 常量池中相同的字符串只要一个,但new String()每new一个目标就会在堆中新建一个目标,不管这个值是否相同。
  • 创立时间不同:String queryType = “1” ,编译阶段在内存中创立;String queryType = new String (“1”),运转阶段在堆中创立目标

== 和 equals 区别
== 和 equals 区别

回到上面的比如,

String queryType = “1”其实适当于执行了两步:

  • String a = “1”;
  • String queryType = “a” ;

在比较过程中,实践上是比较 queryType 和 a 的值是否相等,适当queryType指向字符常量池中的 a ,所以 queryType = “1” 为true

new方法创立的话在堆上创立了两个目标 queryType 和 a,并不指向同一个地址,所以queryType == “1”为 false

综上,在实践开发中如果要比较字符串的值,首选equals()方法

参考资料

blog.csdn.net/weixin_4247…

zhuanlan.zhihu.com/p/618908438