我最近正在学习Java基本概念,当我尝试一些有关String.intern
的代码示例时,发生了一件奇怪的事情。下面的代码:
代码段1(正常):
String str1 = new String("0") + new String("0");
str1.intern();
String str2 = "00";
assertTrue(str1 == str2); // pass
assertTrue(str1.equals(str2)); // pass
摘要2(很奇怪):
String str1 = new String("1") + new String("1");
str1.intern();
String str2 = "11";
assertTrue(str1 == str2); // fail; what happened???
assertTrue(str1.equals(str2)); // pass
摘要3(正常):
String str1 = new String("2") + new String("2");
str1.intern();
String str2 = "22";
assertTrue(str1 == str2); // pass
assertTrue(str1.equals(str2)); // pass
所以,我不了解new String("1")
发生了什么,真的很困惑,我需要您的帮助,非常感谢!
答案 0 :(得分:1)
字符串文字池中已经存在的任何字符串将已经有一个对象,并且在您调用str1.intern()
时将不会添加该对象,因为它已经存在。
启动时,JVM创建了数千个对象,并且在调用main()时,字符串文字池中已经有许多对象。
池中已经有哪些字符串取决于代码之前运行了什么代码。
System.out.println("Strings already in the literal pool");
for (char ch = ' '; ch < 127; ch++) {
String s = Character.toString(ch);
System.out.println(s + " " + (s != s.intern()));
}
打印
Strings already in the literal pool
true
! false
" true
# false
$ false
% true
& true
' true
( false
) false
* true
+ false
, true
- true
. true
/ true
0 false
1 false
2 false
3 false
4 false
5 false
6 false
7 false
8 false
9 false
: true
; false
< true
= false
> false
? false
@ true
A false
B false
C false
D false
E false
F false
G false
H false
I true
J false
K false
L false
M false
N false
O false
P false
Q false
R false
S false
T false
U true
V false
W false
X false
Y false
Z true
[ true
\ false
] true
^ false
_ true
` false
a false
b false
c false
d false
e false
f false
g false
h false
i false
j false
k false
l false
m false
n false
o false
p false
q false
r false
s false
t false
u false
v false
w false
x false
y false
z false
{ false
| true
} false
~ false