代码之家  ›  专栏  ›  技术社区  ›  Johannes

Java中字符串的比较

  •  0
  • Johannes  · 技术社区  · 15 年前
    String string1 = "Hi there";
    String string2 = "Hi";
    String string3 = "Hi";
    
    System.out.println(string1.substring(0, string2.length()) == string2); //1
    System.out.println(string1.substring(0, string2.length()).equals(string2)); //2
    System.out.println(string1.substring(0, string2.length()).compareTo(string2)); //3
    System.out.println(string2 == string3); //4
    System.out.println(string2.substring(0) == string3); //5
    System.out.println(string2.substring(0) == string3.substring(0)); //6
    

    给出输出:

    false
    true
    0
    true
    true
    true
    

    我真的不明白第一句话,为什么它给了我错误?

    如果我在字符串2中添加一个空格,这一行将变为假,但如果不添加空格,则变为真:

    System.out.println(string2.substring(0, string3.length()) == string3);
    

    为什么第1行给我的值应该是假的,但第6行是真的,但是如果我在第2行加一个空格,那就是假的。

    谢谢=)

    7 回复  |  直到 15 年前
        1
  •  14
  •   Jean Barmash    15 年前

    那里发生了几件事。

    当声明两个字符串等于“HI”时,Java优化它以引用相同的字符串对象(因此,它不必两次存储同一个字符串)。

    “==”比较引用。在第1行中使用substring时,所创建的字符串对象与string2具有不同的引用。

    在第6行中,我假设子字符串(0)有一个优化,它知道它可以返回原始字符串,因此这些引用是相等的。

        2
  •  7
  •   MBO    15 年前

    如果要比较字符串,则应使用 String.equals() (或) String.equalsIgnoreCase() 方法。通过比较 == 仅当两个引用指向同一对象时通知您。在您的示例中,就是这样:string2和string3指向同一个string实例 "Hi" (为什么Java应该在编译时创建两个完全相同的字符串)

        3
  •  4
  •   FrustratedWithFormsDesigner    15 年前

    ==运算符检查两个对象是否相等(它们是否引用同一对象),而不是比较其中包含的值。

        4
  •  2
  •   JuanZe Nirbhay Tandon    15 年前

    Java提供了两种基本机制 平等性测试。_==__ 运算符可用于测试基元 相等的值,也可以是 用于确定两个对象 引用指向相同的 基础对象。对于Java对象, equals(object)方法将返回 如果参数等于 调用方法的对象, 其中,等式由 对象类语义。

    因为字符串是对象, 这个 equals(object)方法将返回true 如果两个字符串的内容相同, 也就是说,相同的字符 命令。==运算符只能是 如果两个字符串引用指向 相同的基础字符串对象。 因此,两个字符串表示 相同的含量在测试时相同。 通过equals(object)方法,但将 只有在使用== 如果它们实际上相同,则为运算符 对象。

    引自Javatechniques: http://javatechniques.com/public/java/docs/basics/string-equality.html

        5
  •  1
  •   Tamar    15 年前

    ==比较引用-字符串的地址,而不是其值。为了比较字符串,应该使用equals。JVM将处理新的字符串对象,因此如果存在相同值的对象(String2与String3),它可能引用相同的对象。

        6
  •  1
  •   Davie    15 年前

    ==运算符正在比较两个引用与同一字符串的相等性。

    String类有两个方法,您应该使用它们来比较两个字符串是否相等:

    String1.equals(String2);
    

    如果string1和string2相同(包括字母大小写),则返回true。

    如果你不关心这个案子,你可以用:

    String1.equalsIgnoreCase(String2);
    

    如果string1和string2相等,则返回true,而不管大小写如何(显然)。

        7
  •  1
  •   Bombe    15 年前

    第4、5和6行是 true 因为方法中有以下行 substring(int, int) 属于 java.lang.String :

    return ((beginIndex == 0) && (endIndex == count)) ? this :
        new String(offset + beginIndex, endIndex - beginIndex, value);
    

    因为您请求的子字符串开始于 0 并具有完整字符串的长度,您只需返回对字符串本身的引用,以便 a.substring(0) == a .