【问题标题】:Comparing Same Object of String with '==' and getting different result in both scenerio, where the String Object Value is same [duplicate]将字符串的相同对象与'=='进行比较并在两个场景中得到不同的结果,其中字符串对象值相同[重复]
【发布时间】:2016-02-06 06:03:00
【问题描述】:

在程序 1 中,我声明了两个字符串并将它们初始化为“MADAM”。运行时,我正在检查它们的引用变量的相等性(通过 '==' 运算符')然后我得到一个“真实”的响应。

但在程序 2 中,我声明了一个字符串“S”并将其初始化为“MADAM”。之后,我正在运行一个反向循环并将“S”的字符以相反的顺序存储在其他字符串变量中。现在我再次尝试检查引用变量的相等性(通过'=='运算符')并且得到的响应为'false'。由于两个 String 对象具有相同的值并存储在常量池区域中,因此两个变量都应该相等,并且两个场景中的输出都应该是“真”。但是为什么不一样呢?

方案一:

class Reverse { 
    public static void main(String[] args) {
        String s="MADAM"; String rev="MADAM"; System.out.println(s==rev);
    }
}

输出 - 真

方案二:

class Reverse { 
    public static void main(String[] args) {
        String s="MADAM"; String rev=""; 
        for(int x=s.length()-1;x>=0;x--) { rev+=s.charAt(x); }    
        System.out.println(s==rev);
    }
}

输出错误

【问题讨论】:

  • "由于两个字符串对象 [...] 都存储在常量池中" 你的问题是,这个假设是错误的;在第二种情况下,rev 字符串被分配在堆中并且没有被实习。

标签: java string memory functional-programming


【解决方案1】:

在程序 1 中,java 编译器将“MADAM”字符串保存在一个内存位置,并将“s”和“rev”都分配给该位置,因此“s==rev”返回 true,因为它们都引用相同的地址。 您应该使用“equals()”方法来比较两个字符串。 e.equals(rev);

看看这个问题: Java String.equals versus ==

【讨论】:

  • 是的...然后程序 2 呢...为什么我会在那边弄错...因为在程序 2 执行后 'rev' 再次具有值 'MADAM '。
  • @DhruvGovila 因为在程序 2 中,它们不再位于同一位置。看看我的解决方案。
  • 他在你在运行时初始化字符串的第二个程序中是正确的。所以java编译器不能为新字符串使用之前的内存位置。
【解决方案2】:

在您的第一堂课中,两个字符串都被初始化为同一个对象。所以两者都指向相同的内存位置。

下一节课,Rev 被初始化为 "" 值并查看给女士,因此两者都有不同的内存位置。太假了。

【讨论】:

  • 我想你可能错过了代码行 'for(int x=s.length()-1;x>=0;x--) { rev+=s.charAt(x); }' 。我在哪里再次将“rev”初始化为“MADAM”......
  • 实际上在初始化 Rev ="" 时已经分配了不同的内存位置,所以你在 for 循环中做什么都没关系.. Rev 和 s 不会相等 ==
【解决方案3】:

本质上,

  1. 如果您使用== 进行比较,您就是在比较他们的身份

  2. 如果要比较对象的,请使用.equals()


String s="MADAM"; String rev="MADAM"; System.out.println(s==rev);

上面的代码会返回true,因为两个Strings会存储在同一个内存位置。

但是,您可以尝试以下操作,它会返回 false:

String s1 = "aaa";
String s2 = new String("aaa");

System.out.println(s1 == s2);       //false (comparing memory location)
System.out.println(s1.equals(s2));  //true  (comparing value)

旁注:使用new String("") 创建字符串通常是一种不好的做法。它仅用于演示目的。

【讨论】:

  • 在第二个程序中,我没有使用“新”运算符。所以'rev'和's'应该在同一个'constant memory pool'中,并且在程序执行后输出应该是'true'。而且我知道“等于”功能,并且正在寻找特定于“==”的解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多