You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drools中使用==与equals()比较字符串的异常问题排查

问题原因解析

这是因为Drools规则语言(DRL)的when条件块与then执行块中==运算符的语义完全不同:

  1. when块中的==是Drools规则语言语法
    正如官方文档说明,DRL条件里的==会被引擎转换为值相等比较,等效于java.util.Objects.equals()或字符串的equals()方法,它比较的是字符串的内容而非对象引用。所以在when中用类似Person(name == "John")的写法,能正确匹配内容为"John"的字符串。

  2. then块中的==是原生Java运算符
    then块内的代码是标准Java代码,Java中字符串的==比较的是对象的内存引用,而非内容。只有当两个字符串是内存中的同一个实例(比如字符串常量池里的同一对象)时,==才会返回true。如果req.getPerson().getName()返回的字符串是动态生成的(比如来自数据库、反序列化、动态拼接等),它不会存在于字符串常量池中,和直接写的常量"John"不是同一个引用,因此==会返回false。

你的代码里,equals()方法比较字符串内容所以结果正确,而==在Java代码中做引用比较,自然返回false。


内容的提问来源于stack exchange,提问作者janx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:04:50