Java 简单if语句问题

Java 简单if语句问题,java,if-statement,tostring,Java,If Statement,Tostring,如果事情是真的,我试图返回一个toString 我有以下代码: public void printoutsailings() { for (Sailing s:sailings) { String hamburg = ("Hamburg"); if ((s.getDeparturePort()) == hamburg) { System.out.println(s.toStringAdjusted()); }

如果事情是真的,我试图返回一个toString

我有以下代码:

    public void printoutsailings() {
    for (Sailing s:sailings) {
        String hamburg = ("Hamburg");
        if ((s.getDeparturePort()) == hamburg) {
            System.out.println(s.toStringAdjusted());
        }

  }
}
然而,当我运行这个方法时(当我应该得到一些东西时),我什么也得不到。我假设我把逻辑搞乱了,或者没有正确理解=、==和eq,我不太确定

toString或for循环没有任何错误,我没有得到任何编译器或运行时错误。只是逻辑是错误的

如果有人能纠正我,我将不胜感激。谢谢。

试试看

public void printoutsailings() {
    for (Sailing s:sailings) {
        String hamburg = "Hamburg";
        if (s.getDeparturePort().equals(hamburg)) {
            System.out.println(s.toStringAdjusted());
        }
    }
}

您应该使用
.equals()
而不是
=
来检查
字符串是否相等。请尝试以下操作:

if ((s.getDeparturePort()).equals(hamburg)) {
    System.out.println(s.toStringAdjusted());
}
简而言之,
==
检查两个字符串是否是完全相同的引用,
.equals()
检查两个字符串是否看起来相同

还应该说,您需要使用
.equals()
来检查任何
对象
类型的相等性,而不仅仅是字符串。只有基元类型(
int
double
char
)应使用
=
表示相等


为了补偿偏离可能为空的事实,只需切换条件即可。它会读为-
hamburg.equals(s.getDeparturePort())
而不是简单地提供代码…检查一下,我几乎可以肯定它会让你到达你需要去的地方…

试试
if(s.getDeparturePort().equals(hamburg))
if(hamburg.equals(s.getDeparturePort())
是的,您依赖==比较来获得相等性,而不是一致性。将代码更改为:

if (s.getDeparturePort().equals("hamburg")) {
    System.out.println(s.toStringAdjusted());
}
对于引用类型,Java中的==始终表示“比较两个引用是否相等”。换句话说,它返回两个引用是否引用同一个对象

您需要检查这两个字符串是否相等,即它们是否包含相同的字符序列。这就是重写的
equals
方法的用途

(为了在现实世界中演示这一点,我每天早上都会乘坐36路公交车。对我来说,这些公交车是相等的,因为它们将我带到同一条路线上,但我知道有好几辆36路公交车——我并不是每天都乘坐完全相同的实体公交车。)

请注意,如果
s.getDeparturePort()
返回
null
,上述代码将抛出
NullPointerException
。有两种方法可以避免这种情况。首先,您可以使用已知的非空引用作为方法调用的目标:

if ("hamburg".equals(s.getDeparturePort()))
或者,您可以执行显式空值检查:

String port = s.getDeparturePort();
if (port != null && port.equals("hamburg"))

或者,如果这是最合适的行为(即,如果您确实不希望
getDeparturePort()
返回null,并且如果您得到如此糟糕的数据而不是继续并可能传播问题,那么您可以让它引发异常)。

而不是对字符串对象(或任何对象)使用==,使用.compareTo(),如本例所示:


=
正在比较对象本身,最好使用
.equals()
,因为它将比较字符串的实际值,例如:

if ((s.equals(hamburg)) {
            System.out.println(s.toStringAdjusted());
        }

还要确保
Sailings
至少有1个值,否则无论如何都不会为循环输入该值

必须使用
equals
方法比较字符串

在Java中,
String
是一种引用类型。这意味着您的
字符串hamburg
,指向堆栈中的变量,包含对实际包含该字符串的托管堆对象的引用。相反,值类型完全分配到堆栈中

读取引用等于比较堆栈值。相反,所有类都实现了一个读取值比较的
equals
方法。它比较对象的实际值,无论它们在何处分配

以下代码适用于您:

public void printoutsailings() { 
    for (Sailing s:sailings) { 
        String hamburg = ("Hamburg"); 
        if (hamburg.equals(s.getDeparturePort())) { //First hamburg to prevent any possible NullPointerException
            System.out.println(s.toStringAdjusted()); 
        } 

  } 
} 
出于好奇:

  • PHP仅按值进行比较
  • C#将
    =
    运算符重新定义为值等于运算符,但仅用于
    字符串
  • 在VB.NET中,默认的
    =
    运算符是值等于运算符。
    Is
    运算符对应于参考值

  • 在字符串中,通过
    equals()
    方法或
    compareTo()
    方法检查相等性

    您的解决方案可以通过以下方式修复:

    if (s.getDeparturePort().equals(hamburg)) {
        System.out.println(s.toStringAdjusted());
    }
    
    为了避免从
    s.getDeparturePort()
    接收
    null
    ,我将执行以下操作

    if ("Hamburg".equals(s.getDeparturePort())) {
        System.out.println(s.toStringAdjusted());
    }
    
    这是为了避免
    NullPointerException
    如果
    s.getDeparturePort()
    null
    (来自示例代码)

    或者,您可以像这样使用
    compareTo()
    方法

    您更改的代码(使用
    compareTo()

    我的替代解决方案(使用
    compareTo()

    顺便说一句

    String hamburg = ("Hamburg");
    
    可以很容易地写成

    String hamburg = "Hamburg";
    

    如果
    getDeparturePort()
    返回
    null
    ,该怎么办?感谢您的解释,我简直不敢相信我能做到这一点,因为我已经在我的代码中的其他地方使用了equals()。我计划使用一个else if来避免nullpointerexception,它将覆盖所有其他基础。谢谢:)@jnguy,if
    s.getDeparturePort()
    为null,那么您的解决方案将抛出一个
    NullPointerException
    @Elite Gentle:这可能是完全正确的做法,当然:)感谢您的解释,我不敢相信我做到了这一点,因为我已经在我的代码doh的其他地方使用了equals()!我计划使用一个else-if来避免nullpointerexception,它将覆盖所有其他基。谢谢:)@jngguy和@JonSkeet,或者他可以避免使用“汉堡”。equals(s.getDeparturePort())@josh同意。事实上,我在我的文章末尾已经有了这些信息。Java没有
    Equals
    方法(我看到你也在代码中包含了它。相反,它有一个
    Equals()
    方法。哈哈,看起来我把这个案例错放了。谢谢
    String hamburg = ("Hamburg");
    
    String hamburg = "Hamburg";