java concat中的字符串比较

时间:2016-02-08 17:30:10

标签: java string

package data;
public class A {

    String s = "maew";
        String s2 = s + "class";
        String s1 = "maewclass";
        System.out.println(s2 == s1);
    }
}

但两者都将在字符串常量池中,如果具有相同的内容,则创建一个对象,将不再创建一个引用。 s2和s1应指向字符串常量池中的相同对象。所以答案应为true,为什么它给出错误的

5 个答案:

答案 0 :(得分:3)

字符串常量池是一个内部java功能,您永远不应该依赖它。例如,以下代码将生成" true"

DataContractSerializerHelper.SerializeToStream(viewModel, Response.OutputStream);

但是下面的代码将产生" false":

String s1 = "Hello";
String s2 = "Hello";
boolean result = s1 == s2;

字符串常量池行为可能会从一个java版本更改为另一个java版本,因为它是内部优化功能。它不应该被依赖。在您的情况下,我怀疑因为您使用了String s1 = "Hello"; String s2 = new String("Hello"); boolean result = s1 == s2; 它确实创建了一个新实例。

在任何情况下,任何字符串比较都必须使用类String的方法String s2 = s + "class";

答案 1 :(得分:0)

我没有查看文档,只是做了我自己的测试,我相信你得到的原因" false"是因为你的S2是一个对象和另一个字符串串联的结果。

如果您运行此代码

//          String s = "maew";
        String s2 = "maew" + "class";
        String s1 = "maewclass";
        System.out.println(s2 == s1);

确实正在返回true。所以我相信,java并没有在字符串池中保留Object.toString + "string"的结果。

答案 2 :(得分:0)

String grima = "grima";
String gri = "grima";
if (grima == gri)
    System.out.println("grima == gri"); // The message is displayed

两个变量在字符串常量池中引用相同的“grima”。

String pndey = "pandey";
String pan = "pande";
pan = pan + "y"; // The value for pan will be resolved during runtime.
if (pndey == pan)
    System.out.println("pndey == pan"); // The 2 references are different

现在是第二种情况,如果我改变

pan = pan + "y";pan="pande" +"y",然后会显示“pndey == pan”消息,因为编译器会在编译期间解析文字。

现在按照字符串上的Java文档:

  
      
  • 同一个包(第7节(包))中同一个类(第8节(类))中的文字字符串表示对同一个String对象的引用(第4.3.1节)。
  •   
  • 同一个包中不同类中的文字字符串表示对同一String对象的引用。
  •   
  • 不同包中不同类中的文字字符串同样表示对同一String对象的引用。
  •   
  • 通过常量表达式计算的字符串(第15.28节)在编译时计算,然后将其视为文字。
  •   
  • 在运行时通过串联计算的字符串是新创建的,因此是不同的。
  •   
  • 显式实现计算字符串的结果与具有相同内容的任何预先存在的文字字符串的字符串相同。
  •   

您在此处阅读更多内容:https://codingninjaonline.com/2017/09/18/stringstring-constant-pool-in-java/

答案 3 :(得分:-2)

你需要使用s2.equals(s1)而不是==请仔细阅读提供的链接 here

答案 4 :(得分:-2)

更新:

当我们创建对象时,它的引用被放在字符串常量池内存中。

所以在你的情况下运行程序......

  

JVM找到变量s2,该变量引用s + "class" s也引用maew并将放在字符串常量池内存中。然后它找到另一个引用s1的变量maewclass。   JVM找到两个不同的字符串引用,因此变量s2s1都不会引用相同的字符串(比如.. maewclass)。

当加载类时,如果传递两个相同的值,它将引用前一个对象,而不是创建新的...

    具有相同值的
  • String个对象将始终引用相同的String对象。

    String s = "a";
    String s2 = "a";
    
    System.out.println(s.equals(s2));   //-------return true
    System.out.println(s == s2);        //-------return true 
    
    
                              _____
    s   ------------------>  |     |
                             | "a" |
    s2  ------------------>  |_____|    
                                ^
                                |
                     ___________|____________
                     |        Heap          | 
                     | String Constant Pool |
                     |______________________|
    
  • 使用new运算符创建的
  • String个对象与文字

    不同
    String s = "a";
    String s2 = new String("a");
    System.out.println(s.equals(s2));      //-------return true
    System.out.println(s == s2);           //-------return false