Java平等行为不符合预期

Java平等行为不符合预期,java,android,Java,Android,我目前正在开发一个android应用程序,它使用SimpleListAdapter的子类绑定ListActivity。适配器绑定到的列表类型为list 我必须遵循列表适配器中的If语句 if (dataRow.get("HasLineup1").toString()) == "0") 即使Eclipse调试器在检查窗口中说dataRow.get(“HasLineup1”).toString()等于“0”,我也不会将其计算为true 数据列表是从XML源中填充的,带有行 Game.put("Ha

我目前正在开发一个android应用程序,它使用SimpleListAdapter的子类绑定ListActivity。适配器绑定到的列表类型为
list

我必须遵循列表适配器中的If语句

if (dataRow.get("HasLineup1").toString()) == "0")
即使Eclipse调试器在检查窗口中说
dataRow.get(“HasLineup1”).toString()
等于
“0”
,我也不会将其计算为
true

数据列表是从XML源中填充的,带有行

Game.put("HasLineup1", attributes.getNamedItem("home_lineup").getNodeValue());
我通过将If语句改为

if (Integer.parseInt(dataRow.get("HasLineup1").toString()) == 0)

有人能解释一下为什么我使用的第一个If语句不起作用吗?Java不是我的母语,但基于我的.Net背景,我一辈子都搞不清楚我做错了什么。

如果你使用
string
你应该使用
equals
方法。

if (dataRow.get("HasLineup1").toString())equals("0"))
使用


=
(双等于)仅比较对象以查看它们是否指向内存中的同一位置。
equals
方法实际上是将两个字符串中的字符相互比较。

运算符比较非基元类型的实例内存位置,因此除非操作数的两侧是同一实例,否则此操作将失败。在处理非基本类型时,请使用
equals
而不是
==

在使用“==”之前,必须在两个字符串上使用方法“equals”或call.internal()。

这里有一个链接,其中包含有关==和equals之间差异的引用比较引用,而equals()比较值


相等运算符将根据您正在比较的内容执行以下操作:

  • 两种基本类型(例如,
    int
    char
    ,…):检查它们的值是否相同
  • 两种非基本类型(类实例):检查比较的引用是否指向内存中的同一对象
换句话说,对于非原语,
==
并不意味着语义。您需要使用
equals
方法。它在
对象上定义,因此始终可用。但它的语义是由特定类决定重写该方法的方式(以及是否)决定的


对于字符串,它是与方法的参数逐个字符的比较。

我已经测试过了,这是可行的,但是你能解释一下为什么我原来的If语句不起作用吗?我不仅对解决眼前的问题感兴趣,我还想真正了解发生了什么。正如我在回答中所说,
=
比较内存位置并不相等。字符串是一个对象。每个对象都有一个objectid。它检查它是否是同一个对象。您可以使用“0”进行检查,它是java的一个新对象,并且有另一个objectid@bradley-uffner另外,它们引用不同的内存位置。最好不要将Java新手指向
intern()
,即使这在技术上是正确的。是的,但我更愿意解释所有选项。。。如果我必须快速验证一个字符串是否与一个(多个)字符串池中的一个相同,我将使用internal。。。。Java中的字符串是对象!但是,您可以使用内部方法为字符串选择唯一的引用。在这种情况下,您可以使用“==”(例如,dataRow.get(“HasLineup1”).toString()).internal()==“0.internal())@Matteo它是
intern()
,而不是
internal()
。你最好不要滥用它太多,除非你非常确定自己在做什么。@G_H抱歉。。。我没有检查javadoc,但我知道该方法返回字符串的内部表示形式。我同意这种方法不应该被过度使用(但我想提一下它的存在)@Matteo,这很公平。不过,它并不是那么常用。可能是因为很容易犯错误。我认为Sun的JDK和OpenJDK中字符串实现的
equals
首先检查
=
以捕获最简单的情况(相同的对象),因此使用
intern()
可以提高性能,即使不使用
=
而不是
equals
@G\H我确认Sun(Oracle)String.equals的实现首先执行“==”检查。但是,intern方法依赖于内部字符串池。如果字符串等于传递的字符串,则池将更新(通过插入给定字符串)。因此,我只在希望执行非常快速的比较时才使用该方法(并且比较引用非常快速!)
if (dataRow.get("HasLineup1").toString()).equals("0"))