Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中String.intern的奇怪之处_Java_String - Fatal编程技术网

Java中String.intern的奇怪之处

Java中String.intern的奇怪之处,java,string,Java,String,我最近正在学习Java基本概念,当我尝试一些关于String.intern的代码示例时,发生了一件奇怪的事情。代码如下: 片段1(正常): 片段2(奇怪): 代码片段3(正常): 所以,我不明白新字符串(“1”)发生了什么,它真的很混乱,我需要你的帮助,非常感谢 字符串文本池中已经存在的任何字符串都将已经有一个对象,并且在调用str1.intern()时不会添加该对象,因为它已经存在 在启动时,JVM创建数千个对象,并且在调用main()时,字符串文本池中已经有许多对象 池中已经存在哪些字符串取

我最近正在学习Java基本概念,当我尝试一些关于
String.intern
的代码示例时,发生了一件奇怪的事情。代码如下:

片段1(正常):

片段2(奇怪):

代码片段3(正常):


所以,我不明白新字符串(“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()));
}
System.out.println(“文本池中已存在字符串”);
for(char ch='';ch<127;ch++){
字符串s=字符.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
文本池中已存在字符串
真的
! 假的
”“是的
#假的
$false
%真的
&真的
”“是的
(错
)假的
*真的
+假的
是的
-真的
.是的
/真的
0错误
1错误
2错误
3错误
4错误
5错误
6错误
7错误
8错误
9错误
:对
;假的
假的
?错误
@真的
假的
B错
C错误
D错误
虚假的
F错误
G假
H错误
我是真的
J假
K假
我错了
我错了
N错
哦,错
P错误
Q错
R错
这是假的
不假
你说得对
V错误
W错
X错误
虚假的
真的
[是的
\假的
]真的
^假的
_真的
`假的
假的
b错
c错误
d错误
虚假的
f错误
g假
h错误
我错了
j假
k假
我错了
我错了
n错
哦,错
p错误
q错
r错
这是假的
不假
你错了
v错误
w错
x错误
虚假的
z错误
{错
|真的
}假的
~z~假的

assertTrue(str1.equals(str2));?通过测试了吗?
assertTrue(str1.equals(str2));//通过了
Nice…只需对
字符串使用
.equals()
-比较谢谢你,德哈尔!但我想知道为什么
新字符串(“1”)
失败了
=
比较参考地址:(请看一看,解释和示例是greatThank you,Peter Lawrey。
String str1 = new String("2") + new String("2");
str1.intern();
String str2 = "22";
assertTrue(str1 == str2); // pass
assertTrue(str1.equals(str2)); // pass
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