老生常谈的 Java 面试题 字符相等

2017-03-24 13:56:08 +08:00
 huiyue
String a="abc";
String b="abc";
System.out.println(a==b);
3424 次点击
所在节点    Java
10 条回复
Troevil
2017-03-24 13:58:14 +08:00
String a="abc";
String b="abc";
System.out.println(a==b);
String c=new String("abc");
System.out.println(b==c);
misaka19000
2017-03-24 14:19:12 +08:00
我想起来 r 大的那篇文章了
murmur
2017-03-24 14:20:04 +08:00
所以最简单的不就是把用=判断相等的打死不就完了
Chrisplus
2017-03-24 14:33:58 +08:00
'''
In computer science, string interning is a method of storing only one copy of each distinct string value, which must be immutable. Interning strings makes some string processing tasks more time- or space-efficient at the cost of requiring more time when the string is created or interned. The distinct values are stored in a string intern pool.
'''
shalk
2017-03-25 13:08:53 +08:00
== 用于基本类型的比较,对象会直接比较引用
对象建议用 equals 比较,但需要实现这个方法。

String 作为对象也按照这个规则,但是它有一个 String Pool 的概念( http://stackoverflow.com/questions/3052442/what-is-the-difference-between-text-and-new-stringtext
cs4814751
2017-03-28 09:41:03 +08:00
cwek
2017-03-28 15:44:50 +08:00
String 是对象,==对于对象判断引用一致。
字面 String 常量,还要包括编译器常量折叠后的,通过常量池实现引用一致,通过运行期 new 出来的都在堆中,肯定引用不一致。
intern()方法在 java 版本有不同
运行期 String.intern()会查找 String 缓存池有没相同内容的,有则返回相同引用。
但:
1.6 及之前,没则复制一份到 String 常量池,并返回引用,引用对象相同。
1.7 及之后,没则复制一个堆引用到 String 常量池并返回,实际返回的还是堆引用,与常量引用不同。
huiyue
2017-03-28 20:29:04 +08:00
@Troevil @misaka19000 @cwek @shalk @Chrisplus @murmur @cs4814751 回复一下。这是公司的一道面试题。但面试里面 5 年以下工作经验的,答对的不多。
misaka19000
2017-03-28 20:50:33 +08:00
@huiyue 只能说你们公司技术太烂,面试的都是些什么人
huiyue
2017-03-30 17:01:30 +08:00
@misaka19000 很有道理。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/350023

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX