Java String 一个简单例子的深思 (对象比较 值相等 相关问题)

只要是学习过Java的人,都一定对String类再熟悉不过了。可是你真的理解了String吗?
下面让我们来做个试验,看你能否全部答对如下的问题(面试时也许你会遇到下面的问题哟,大家要好好回答啊。):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.test;
public class StringEx
{
public static void main(String[] args)
{
String s1 = "abc";
String s2 = new String(s1);
if (s1 == s2)
System.out.println("s1 == s2");
if (s1.equals(s2))
System.out.println("s1.equals(s2)");
String s3 = "abc";
if (s1 == s3)
System.out.println("s1 == s3");
if (s1.equals(s3))
System.out.println("s1.equals(s3)");
String s4 = new String("abc");
if (s1 == s4)
System.out.println("s1 == s4");
if (s1.equals(s4))
System.out.println("s1.equals(s4)");
if (s2 == s4)
System.out.println("s2 == s4");
if (s2.equals(s4))
System.out.println("s2.equals(s4)");
if (s1 == "abc")
System.out.println("s1 == \"abc\"");
if (s2 == "abc")
System.out.println("s2 == \"abc\"");
if (s4 == "abc")
System.out.println("s4 == \"abc\"");
}
}

现在请大家自己试着写出程序的运行结果,不要看后面的答案哟…
(答题中…)
好了,答题结束。相信大家现在自己都有了心中的答案。
现在让我们来看下程序实践的运行结果:

1
2
3
4
5
6
s1.equals(s2)
s1 == s3
s1.equals(s3)
s1.equals(s4)
s2.equals(s4)
s1 == "abc"

哈哈,答案公布了,你全都答对了吗?如果你全都答对了,恭喜你,你对String类的理解已经不再是新手了(String的深一步理解,我以后会再写文章来讨论。)。
其实,如果你能将上面的结果全都答对,不仅说明你对String类有了比较深的理解,更说明你对Java对象是如何在内存中存储的,已经有了比较深的理解。
如果有的运行结果和你期待的结果不一致,说明你对对象及对象的值,理解可能出现了歧义。
(Debug一下上面的程序,看看“Variables”窗口那四个变量的ID,你就会明白错在哪儿了)

    通过上面一个很简单的例子,说明我们看似很熟悉的东西,其实我们未必很熟悉。因为一个小小的理解错误,可能会导致一个项目中很大的bug,往往这样的bug又很难发现(因为我们经常把这样的bug忽略了)。

    希望大家如果还有类似的经验和理解,请不要吝惜您的经验,和大家一起分享,让我们共同进步。

坚持原创及高品质技术分享,您的支持将鼓励我继续创作!