字符串对象和字符串文字之间的区别
这个问题在这里已经有了答案:
当你使用字符串文字时,字符串可以被拦截,但是当你使用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;
在这种情况下, str
和str2
是对不同Objects
引用,它们都没有被执行过,所以当你使用==
测试Object
标识时,你将会得到false
。
在良好的编码实践方面:不要使用==
来检查字符串是否相等,而是使用.equals()
。