簡體   English   中英

Java 中 String.intern 的奇怪之處

[英]weird thing about String.intern in Java

我最近在學習 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")發生了什么,真的很困惑,我需要你的幫助,非常感謝!

任何已經在字符串文字池中的字符串都已經有一個對象,並且在調用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM