Java 将字符串的同一对象与'==';在两个场景中得到不同的结果,其中字符串对象值相同

Java 将字符串的同一对象与'==';在两个场景中得到不同的结果,其中字符串对象值相同,java,string,memory,functional-programming,Java,String,Memory,Functional Programming,在程序1中,我声明了两个字符串,并将它们初始化为“MADAM”。运行时,我检查它们的引用变量是否相等(通过“==”运算符),然后得到“true”响应 但在程序2中,我声明了一个字符串“S”,并将其初始化为“夫人”。之后,我运行一个反向循环,并在另一个字符串变量中以相反顺序存储“S”的字符。现在我再次尝试检查引用变量的相等性(通过“==”操作符),得到的响应为“false”。由于两个字符串对象具有相同的值,并且存储在常量池区域中,因此两个变量应该相等,并且两个场景中的输出都应该为“true”。但为

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

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

方案1:

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

方案2:

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);
    }
}

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

看看这个问题:
在第一个类中,两个字符串都初始化为同一个对象。所以两者都指向相同的内存位置

下一个类,Rev被初始化为“”值,并查看madam,这样两者都有不同的内存位置。太假了

本质上

  • 如果您使用
    ==
    进行比较,则您正在比较他们的身份

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


  • 上面的代码将返回true,因为这两个字符串将存储在同一个内存位置

    但是,您可以尝试以下操作,它将返回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)
    


    旁注:使用
    新字符串(“”
    )创建字符串通常是不好的做法。它仅用于演示目的。

    “由于两个字符串对象[…]都存储在常量池中”,这是您的问题,这种假设是错误的;在第二种情况下,
    rev
    字符串是在堆中分配的,不被占用。。。那么节目2呢。。。为什么我在那里变得虚伪。。。因为在执行程序2后,“rev”再次具有值“MADAM”。@DhruvGovila,因为在程序2,它们不再位于同一位置。看看我的解决方案,他就在运行时初始化字符串的第二个程序中。因此,java编译器无法将以前的内存位置用于新字符串。我认为您可能错过了(int x=s.length()-1;x>=0;x--){rev+=s.charAt(x);}的代码行。在这里,我将“rev”再次初始化为“MADAM”…实际上,在初始化rev=”“时,已经分配了不同的内存位置,所以无论您在for循环中执行什么操作。。Rev和s将不相等==在第二个程序中,我没有使用“new”运算符。所以'rev'和's'应该在同一个'constant memory pool'中,并且在程序执行后,输出应该为'true'。我知道“equals”函数,并且正在寻找特定于“==”的解决方案。谢谢
    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)