字符串对象和字符串文字之间的区别

这个问题在这里已经有了答案:

  • “text”和新的String(“text”)之间有什么区别? 9个答案

  • 当你使用字符串文字时,字符串可以被拦截,但是当你使用new String("...")你会得到一个新的字符串对象。

    在这个例子中,两个字符串文字都引用同一个对象:

    String a = "abc"; 
    String b = "abc";
    System.out.println(a == b);  // true
    

    这里创建了2个不同的对象,它们具有不同的引用:

    String c = new String("abc");
    String d = new String("abc");
    System.out.println(c == d);  // false
    

    一般来说,您应该尽可能使用字符串文字符号。 它比较容易阅读,并且使编译器有机会优化代码。


    字符串文字是一种Java语言概念。 这是一个字符串文字:

    "a String literal"
    

    String对象是java.lang.String类的单独实例。

    String s1 = "abcde";
    String s2 = new String("abcde");
    String s3 = "abcde";
    

    所有这些都是有效的,但是有一点区别。 s1将引用一个实际的String对象。 这意味着字符序列"abcde"将存储在中心位置,并且每当再次使用相同的字面值"abcde"时,JVM将不会创建新的String对象,而是使用缓存的String的引用。

    s2被保证是一个新的String对象,所以在这种情况下我们有:

    s1 == s2 // is false
    s1 == s3 // is true
    s1.equals(s2) // is true
    

    长的答案在这里可用,所以我会给你一个短的答案。

    当你这样做时:

    String str = "abc";
    

    您正在调用String上的intern()方法。 此方法引用String对象的内部池。 如果您调用intern()的字符串已经驻留在池中,那么对该String的引用将分配给str 。 如果没有,那么新的String被放置在池中,然后对它的引用被分配给str

    给出以下代码:

    String str = "abc";
    String str2 = "abc";
    boolean identity = str == str2;
    

    当你通过执行==检查对象身份(你真的在问:这两个引用指向同一个对象吗?),你会得到true

    但是,您不需要intern() Strings 。 您可以通过执行以下操作在堆上的新Object上强制创建:

    String str = new String("abc");
    String str2 = new String("abc");
    boolean identity = str == str2;
    

    在这种情况下, strstr2是对不同Objects引用,它们都没有被执行过,所以当你使用==测试Object标识时,你将会得到false

    在良好的编码实践方面:不要使用==来检查字符串是否相等,而是使用.equals()

    链接地址: http://www.djcxy.com/p/72125.html

    上一篇: Difference between string object and string literal

    下一篇: How safe and reliable are C++ String Literals?