当前位置: 首页 > 面试题库 >

Java中==和.equals之间的区别。

孔城
2023-03-14
问题内容

我知道已经解决了这个问题,但是我在SO上看到了不一致的论点。

所以,如果我有:

String a = "apple2e";
String b = "apple2e";

System.out.println("a==b? " + a == b);

我得到 FALSE

据我了解,这是因为ab是对同一对象(apple2e)的两个不同引用。

所以我会有类似的东西:

a (reference_id 123) ------
                           ---------  "apple2e"
b (reference_id 456) ------

现在,如果我只想比较两个字符串的 内容 ,我将使用a.equals(b)

这是否意味着如果两个引用指向同一个对象,JVM就会简单地返回?因此,它不是在逐个字符地进行比较吗?

谢谢

编辑

拿着电话。感谢delnan您指出+优先顺序!!!

当我将其更改为:

System.out.println(a == b);

我确实得到了true

这更有意义。

编辑2

我不敢相信我没有抓住。大声笑

我在做:

"a==b? " + a == b

转化为

"a==b? apple2e" == "apple2e"

难怪这是假的!


问题答案:

据我了解,这是因为a和b是对同一对象(apple2e)的两个不同引用。

因为使用字符串实习,并且 因为使用字符串实习ab对同一String对象的引用不同。

不幸的是,您的代码没有执行您认为的操作。试试这个:

String a = "apple2e";
String b = "apple2e";

System.out.println("a==b? " + a == b);    // "false"
System.out.println("a==b? " + (a == b));  // "a==b? true"

Java自动插入所有字符串文字。
就是为什么第二个sysout打印其功能的原因。仅"false"因为字符串连接(+)的优先级高于==,才输出第一个sysout ,因此它等效于此:

System.out.println("a==b? apple2e" == "apple2e");

我认为这不是您要测试的内容!

另一方面,这将为您提供两个单独的String实例:

String a = new String("apple2e");
String b = new String("apple2e");

System.out.println("a==b? " + (a == b));  // "a==b? false"

示意性地看起来像

a (reference_id 123) ---------------  "apple2e"

b (reference_id 456) ---------------  "apple2e"

可以使用以下方法还原为原始情况String#intern()

String a = new String("apple2e").intern();
String b = new String("apple2e").intern();

System.out.println("a==b? " + (a == b));  // "a==b? true"

例如

a (reference_id 123) ------+
                           +---------  "apple2e"
b (reference_id 456) ------+


 类似资料:
  • 问题内容: 在java中==和equals的区别? 问题答案: .equals(…) 只会比较所写的内容进行比较,不会多也不会少。 如果一个类没有覆盖equals方法,则默认为equals(Object o)覆盖了该方法的最接近的父类的方法。 如果没有父类提供重写,则它默认为最终父类Object中的方法,因此你只能使用该Object#equals(Object o)方法。根据对象API,这与==;

  • 问题内容: 我在很多地方读到说 Java中的覆盖方法时,也应该覆盖方法,否则就是“违反合同”。 但是到目前为止,如果我仅覆盖equals方法,而不覆盖hashCode方法,则不会遇到任何问题。 什么合同 为何我在违反合同时没有遇到任何问题?如果没有重写hashCode方法,在哪种情况下会遇到问题? 问题答案: 你将遇到的问题是集合,其中元素的唯一性是根据和计算的,例如。 顾名思义,它依赖于哈希表,

  • 问题内容: 和java 和有什么不一样? 我想加载一个库,但是不想将路径添加到环境变量。这些方法中的任何一种都会有用吗? 问题答案: API文档中有区别。使您可以从默认路径加载-Java库路径。 另一个允许您从绝对路径加载它,必须将其指定为文件名。 如果您不想弄乱环境变量,则应使用

  • 问题内容: 如何不同? 他们似乎做同样的事情对我来说(也无二等等,他们如何不同? 另外,根据惯例,其中哪一种更可取,且使用频率更高? 问题答案: 好吧,确实确实说了完全像给了一样解释了。但是,返回一个对象,而返回一个图元。 如果你想享受的潜在缓存优势Integer.valueOf(int),则还可以使用以下方法: 现在,如果你想要的是对象,而不是原始的,然后使用可能比制作一个新的对象出更有吸引力,

  • 本文向大家介绍Java中HashMap和Hashtable之间的区别,包括了Java中HashMap和Hashtable之间的区别的使用技巧和注意事项,需要的朋友参考一下 Hashtable是原始java.util的一部分,是Dictionary的具体实现。但是,Java 2重新设计了Hashtable,使其也实现了Map接口。因此,哈希表现在已集成到集合框架中。它类似于HashMap,但已同步。

  • 本文向大家介绍Java中LinkedList和LinkedHashSet之间的区别,包括了Java中LinkedList和LinkedHashSet之间的区别的使用技巧和注意事项,需要的朋友参考一下 LinkedList和LinkedHashSet都是Java Collection框架最重要的类之一。 以下是LinkedList和LinkedHashSet之间的重要区别。 序号 键 链表 链接哈希