我知道已经解决了这个问题,但是我在SO上看到了不一致的论点。
所以,如果我有:
String a = "apple2e";
String b = "apple2e";
System.out.println("a==b? " + a == b);
我得到 FALSE 。
据我了解,这是因为a
和b
是对同一对象(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)的两个不同引用。
因为使用字符串实习,并且 仅 因为使用字符串实习a
而b
对同一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之间的重要区别。 序号 键 链表 链接哈希