AP计算机科学A字符串:内容相同,为什么使用两个等号仍可能是false?

AP Computer Science A学习中,同样写着lab的两个字符串,未必是同一个对象。理解变量中保存的引用,有助于说明为什么有时两个等号得到false,而equals得到true。下面是独立编写的Java语义练习,讨论基础规则,不据某个JDK文档版本推断考试指定版本或全部考查范围。

想结合自己的基础讨论下一步?到文末扫码联系翰林,发送“AP-STRING-CONTENT-1113”,说明年级、学习目标和目前最困惑的问题。

先让两个对象明确分开创建

考虑语句String a = new String("lab");以及String b = new String("lab");。两个new表达式各创建一个String对象,内容都是三个字符lab,但a和b引用不同对象。在这种明确条件下,a == b为false,而a.equals(b)为true。前者比较引用是否相同,后者使用String定义的字符序列比较。

赋值复制引用,不会自动新建对象

再写String c = a;,此时c与a引用同一个对象,所以a == c为true,a.equals(c)也为true。可以画两个对象框,把a与c的箭头指向同一框,把b指向另一框。这样可以直接看出“内容相同”与“箭头指向相同”是两个不同的问题,不必把false理解成字符串中的某个字母不同。

为什么字面量测试可能让人误会

如果只测试String p = "lab";与String q = "lab";,相同字符串字面量会共享驻留实例,因此p == q为true。这不能证明两个等号适合比较所有字符串内容;从输入、计算或显式new得到的对象可能不同。学习时应先说明对象来源,再解释输出,不用某一次碰巧为true的结果替代通用比较规则。

还要检查调用方法的对象是否为空

如果a为null,a.equals(b)会在调用时抛出NullPointerException,不能返回一个简单的false。若题目允许空值,可以先检查引用,或在与固定文本比较时使用"lab".equals(a),后者在a为null时为false。要分清“没有对象可调用方法”与“存在对象但内容不相等”,它们对应不同的执行结果。

把比较目标写成一句话再选表达式

想知道两个变量是否指向同一个对象,用引用相等;想比较两个String的字符内容,按String的equals语义处理,并考虑空值条件。这个规则不能随意推广为所有类的equals都比较内容,因为具体类可能有不同实现。复习时把创建、赋值和比较三类语句分开标记,再逐行追踪,比只背“字符串不用双等号”更准确。

延伸阅读:AP计算机科学A数组:写下b=a之后,真的复制了全部元素吗?。

带着具体问题,扫码联系翰林

正在了解项目、选择学习方向,或已经开始准备?用微信扫描下方二维码,发送“AP-STRING-CONTENT-1113”。请补充年级、所在地区、当前基础和最想解决的问题,方便沟通时直接聚焦。

微信扫码联系翰林,发送AP-STRING-CONTENT-1113咨询学习与准备问题

微信咨询学习与准备方向

电脑阅读可用微信扫码;手机阅读可点击入口,或保存二维码后在微信内识别。

官方信息与延伸资料:资料1 资料2 资料3

在线客服
微信咨询