The return of String.intern() explained
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
Consider:
String s1 = new StringBuilder("Cattie").append(" & Doggie").toString();
System.out.println(s1.intern() == s1); // true why?
System.out.println(s1 == "Cattie & Doggie"); // true another why?
String s2 = new StringBuilder("ja").append("va").toString();
System.out.println(s2.intern() == s2); // false
String s3 = new String("Cattie & Doggie");
System.out.println(s3.intern() == s3); // false
System.out.println(s3 == "Cattie & Doggie"); // false
I got confused why they are resulting differently by the returned value of String.intern()
which says:
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
Especially after these two tests:
assertFalse("new String() should create a new instance", new String("jav") == "jav");
assertFalse("new StringBuilder() should create a new instance",
new StringBuilder("jav").toString() == "jav");
I once read a post talking about some special strings
interned before everything else, but it's a real blur now.
If there are some strings pre-interned
, is there a way to get kind of a list of them? I am just curious about what they can be.
Updated
Thanks to the help of @Eran and @Slaw, I finally can explain what just happened there for the output
true
true
false
false
false
- Since
"Cattie & Doggie"
doesn't exist in the pool, s1.intern() will put the current object reference to the pool and return itself, sos1.intern() == s1
; "Cattie & Doggie"
already in the pool now, so string literal"Cattie & Doggie"
will just use the reference in pool which is actuallys1
, so again we havetrue
;new StringBuilder().toString()
will create a new instance while"java"
is already in the pool and then the reference in pool will be returned when callings2.intern()
, sos2.intern() != s2
and we havefalse
;new String()
will also return a new instance, but when we try tos3.intern()
, it will return the previously stored reference in the pool which is actualys1
sos3.intern() != s3
and we havefalse
;- As #2 already discussed, String literal
"Cattie & Doggie"
will return the reference already stored in the pool (which is actuallys1
), sos3 != "Cattie & Doggie"
and we havefalse
again.
Thanks for @Sunny to provide a trick to get all the interned
strings.
java string-interning
add a comment |
Consider:
String s1 = new StringBuilder("Cattie").append(" & Doggie").toString();
System.out.println(s1.intern() == s1); // true why?
System.out.println(s1 == "Cattie & Doggie"); // true another why?
String s2 = new StringBuilder("ja").append("va").toString();
System.out.println(s2.intern() == s2); // false
String s3 = new String("Cattie & Doggie");
System.out.println(s3.intern() == s3); // false
System.out.println(s3 == "Cattie & Doggie"); // false
I got confused why they are resulting differently by the returned value of String.intern()
which says:
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
Especially after these two tests:
assertFalse("new String() should create a new instance", new String("jav") == "jav");
assertFalse("new StringBuilder() should create a new instance",
new StringBuilder("jav").toString() == "jav");
I once read a post talking about some special strings
interned before everything else, but it's a real blur now.
If there are some strings pre-interned
, is there a way to get kind of a list of them? I am just curious about what they can be.
Updated
Thanks to the help of @Eran and @Slaw, I finally can explain what just happened there for the output
true
true
false
false
false
- Since
"Cattie & Doggie"
doesn't exist in the pool, s1.intern() will put the current object reference to the pool and return itself, sos1.intern() == s1
; "Cattie & Doggie"
already in the pool now, so string literal"Cattie & Doggie"
will just use the reference in pool which is actuallys1
, so again we havetrue
;new StringBuilder().toString()
will create a new instance while"java"
is already in the pool and then the reference in pool will be returned when callings2.intern()
, sos2.intern() != s2
and we havefalse
;new String()
will also return a new instance, but when we try tos3.intern()
, it will return the previously stored reference in the pool which is actualys1
sos3.intern() != s3
and we havefalse
;- As #2 already discussed, String literal
"Cattie & Doggie"
will return the reference already stored in the pool (which is actuallys1
), sos3 != "Cattie & Doggie"
and we havefalse
again.
Thanks for @Sunny to provide a trick to get all the interned
strings.
java string-interning
add a comment |
Consider:
String s1 = new StringBuilder("Cattie").append(" & Doggie").toString();
System.out.println(s1.intern() == s1); // true why?
System.out.println(s1 == "Cattie & Doggie"); // true another why?
String s2 = new StringBuilder("ja").append("va").toString();
System.out.println(s2.intern() == s2); // false
String s3 = new String("Cattie & Doggie");
System.out.println(s3.intern() == s3); // false
System.out.println(s3 == "Cattie & Doggie"); // false
I got confused why they are resulting differently by the returned value of String.intern()
which says:
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
Especially after these two tests:
assertFalse("new String() should create a new instance", new String("jav") == "jav");
assertFalse("new StringBuilder() should create a new instance",
new StringBuilder("jav").toString() == "jav");
I once read a post talking about some special strings
interned before everything else, but it's a real blur now.
If there are some strings pre-interned
, is there a way to get kind of a list of them? I am just curious about what they can be.
Updated
Thanks to the help of @Eran and @Slaw, I finally can explain what just happened there for the output
true
true
false
false
false
- Since
"Cattie & Doggie"
doesn't exist in the pool, s1.intern() will put the current object reference to the pool and return itself, sos1.intern() == s1
; "Cattie & Doggie"
already in the pool now, so string literal"Cattie & Doggie"
will just use the reference in pool which is actuallys1
, so again we havetrue
;new StringBuilder().toString()
will create a new instance while"java"
is already in the pool and then the reference in pool will be returned when callings2.intern()
, sos2.intern() != s2
and we havefalse
;new String()
will also return a new instance, but when we try tos3.intern()
, it will return the previously stored reference in the pool which is actualys1
sos3.intern() != s3
and we havefalse
;- As #2 already discussed, String literal
"Cattie & Doggie"
will return the reference already stored in the pool (which is actuallys1
), sos3 != "Cattie & Doggie"
and we havefalse
again.
Thanks for @Sunny to provide a trick to get all the interned
strings.
java string-interning
Consider:
String s1 = new StringBuilder("Cattie").append(" & Doggie").toString();
System.out.println(s1.intern() == s1); // true why?
System.out.println(s1 == "Cattie & Doggie"); // true another why?
String s2 = new StringBuilder("ja").append("va").toString();
System.out.println(s2.intern() == s2); // false
String s3 = new String("Cattie & Doggie");
System.out.println(s3.intern() == s3); // false
System.out.println(s3 == "Cattie & Doggie"); // false
I got confused why they are resulting differently by the returned value of String.intern()
which says:
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
Especially after these two tests:
assertFalse("new String() should create a new instance", new String("jav") == "jav");
assertFalse("new StringBuilder() should create a new instance",
new StringBuilder("jav").toString() == "jav");
I once read a post talking about some special strings
interned before everything else, but it's a real blur now.
If there are some strings pre-interned
, is there a way to get kind of a list of them? I am just curious about what they can be.
Updated
Thanks to the help of @Eran and @Slaw, I finally can explain what just happened there for the output
true
true
false
false
false
- Since
"Cattie & Doggie"
doesn't exist in the pool, s1.intern() will put the current object reference to the pool and return itself, sos1.intern() == s1
; "Cattie & Doggie"
already in the pool now, so string literal"Cattie & Doggie"
will just use the reference in pool which is actuallys1
, so again we havetrue
;new StringBuilder().toString()
will create a new instance while"java"
is already in the pool and then the reference in pool will be returned when callings2.intern()
, sos2.intern() != s2
and we havefalse
;new String()
will also return a new instance, but when we try tos3.intern()
, it will return the previously stored reference in the pool which is actualys1
sos3.intern() != s3
and we havefalse
;- As #2 already discussed, String literal
"Cattie & Doggie"
will return the reference already stored in the pool (which is actuallys1
), sos3 != "Cattie & Doggie"
and we havefalse
again.
Thanks for @Sunny to provide a trick to get all the interned
strings.
java string-interning
java string-interning
edited Mar 13 at 14:24
John Kugelman
249k54406460
249k54406460
asked Mar 13 at 6:50
HearenHearen
2,94511530
2,94511530
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
s2.intern()
would return the instance referenced by s2
only if the String pool didn't contain a String
whose value is "java" prior to that call. The JDK classes intern some String
s before your code is executed. "java" must be one of them. Therefore, s2.intern()
returns the previously interned instance instead of s2
.
On the other hand, the JDK classes did not intern any String
whose value is equal to "Cattie & Doggie", so s1.intern()
returns s1
.
I am not aware of any list of pre-interned Strings. Such a list will most likely be considered an implementation detail, which may vary on different JDK implementations and JDK versions, and should not be relied on.
thank you for the detailed explanation, so is it correct to say: s.intern() will return the original reference if the string is not interned but if it's already interned (in the constant pool) then it returns the reference in the constant pool?
– Hearen
Mar 13 at 7:06
@Hearen that's true, as the javadoc says - "When the intern method is invoked, if the pool already contains a string equal to this String object as determined bythe equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. "
– Eran
Mar 13 at 7:08
sorry to disrupt you again. If that's so then why the second why still returns atrue
? ... so confusing now... but when I replaced thenew StringBuilder().toString()
withnew String()
both of them will becomefalse
. So weird...
– Hearen
Mar 13 at 7:13
2
"any list of pre-interned Strings" would depend on which JDK classes your program happened to load as well.
– Alexey Romanov
Mar 13 at 8:13
2
@AlexeyRomanov and the launcher, e.g. the commonly used standard launcher loads the specfied main class and does agetMethod("main", String.class)
on it, thus “pre-interning” the string"main"
. A different launcher, e.g. a native launcher invoking the main method via JNI would behave differently. Likewise, the way command line options are processed may differ and hence, have different effect on the list of “pre-interned” strings.
– Holger
Mar 13 at 8:51
|
show 8 more comments
When the intern() method is invoked on a String object it looks the string contained by this String object in the pool, if the string is found there then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
So java
string must already be in the pool. hence it is giving false.
You can print all strings in pool
How to print the whole String pool?
Here is an example to get all string if you are using openjdk.
I just tried with the example in github you enclosed, it seems not working though I added the dependency it requires$JAVA_HOME/lib/sa-jdi.jar
. As for the OS link, How to print the whole String pool?, it's not tested yet but looks so tricky. Thanks for the help :)
– Hearen
Mar 13 at 10:53
add a comment |
String literals (those that are hardcoded like "a string") are already interned for you by the compiler. But those strings that are acquired programmatically are not, and will be interned only if you use .intern()
method.
Usually you don't intern strings manually, unless you know you will store in memory a large number of repeating strings, so you can save a lot of memory that way.
That is explained here:
What is Java String interning?
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55135968%2fthe-return-of-string-intern-explained%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
s2.intern()
would return the instance referenced by s2
only if the String pool didn't contain a String
whose value is "java" prior to that call. The JDK classes intern some String
s before your code is executed. "java" must be one of them. Therefore, s2.intern()
returns the previously interned instance instead of s2
.
On the other hand, the JDK classes did not intern any String
whose value is equal to "Cattie & Doggie", so s1.intern()
returns s1
.
I am not aware of any list of pre-interned Strings. Such a list will most likely be considered an implementation detail, which may vary on different JDK implementations and JDK versions, and should not be relied on.
thank you for the detailed explanation, so is it correct to say: s.intern() will return the original reference if the string is not interned but if it's already interned (in the constant pool) then it returns the reference in the constant pool?
– Hearen
Mar 13 at 7:06
@Hearen that's true, as the javadoc says - "When the intern method is invoked, if the pool already contains a string equal to this String object as determined bythe equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. "
– Eran
Mar 13 at 7:08
sorry to disrupt you again. If that's so then why the second why still returns atrue
? ... so confusing now... but when I replaced thenew StringBuilder().toString()
withnew String()
both of them will becomefalse
. So weird...
– Hearen
Mar 13 at 7:13
2
"any list of pre-interned Strings" would depend on which JDK classes your program happened to load as well.
– Alexey Romanov
Mar 13 at 8:13
2
@AlexeyRomanov and the launcher, e.g. the commonly used standard launcher loads the specfied main class and does agetMethod("main", String.class)
on it, thus “pre-interning” the string"main"
. A different launcher, e.g. a native launcher invoking the main method via JNI would behave differently. Likewise, the way command line options are processed may differ and hence, have different effect on the list of “pre-interned” strings.
– Holger
Mar 13 at 8:51
|
show 8 more comments
s2.intern()
would return the instance referenced by s2
only if the String pool didn't contain a String
whose value is "java" prior to that call. The JDK classes intern some String
s before your code is executed. "java" must be one of them. Therefore, s2.intern()
returns the previously interned instance instead of s2
.
On the other hand, the JDK classes did not intern any String
whose value is equal to "Cattie & Doggie", so s1.intern()
returns s1
.
I am not aware of any list of pre-interned Strings. Such a list will most likely be considered an implementation detail, which may vary on different JDK implementations and JDK versions, and should not be relied on.
thank you for the detailed explanation, so is it correct to say: s.intern() will return the original reference if the string is not interned but if it's already interned (in the constant pool) then it returns the reference in the constant pool?
– Hearen
Mar 13 at 7:06
@Hearen that's true, as the javadoc says - "When the intern method is invoked, if the pool already contains a string equal to this String object as determined bythe equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. "
– Eran
Mar 13 at 7:08
sorry to disrupt you again. If that's so then why the second why still returns atrue
? ... so confusing now... but when I replaced thenew StringBuilder().toString()
withnew String()
both of them will becomefalse
. So weird...
– Hearen
Mar 13 at 7:13
2
"any list of pre-interned Strings" would depend on which JDK classes your program happened to load as well.
– Alexey Romanov
Mar 13 at 8:13
2
@AlexeyRomanov and the launcher, e.g. the commonly used standard launcher loads the specfied main class and does agetMethod("main", String.class)
on it, thus “pre-interning” the string"main"
. A different launcher, e.g. a native launcher invoking the main method via JNI would behave differently. Likewise, the way command line options are processed may differ and hence, have different effect on the list of “pre-interned” strings.
– Holger
Mar 13 at 8:51
|
show 8 more comments
s2.intern()
would return the instance referenced by s2
only if the String pool didn't contain a String
whose value is "java" prior to that call. The JDK classes intern some String
s before your code is executed. "java" must be one of them. Therefore, s2.intern()
returns the previously interned instance instead of s2
.
On the other hand, the JDK classes did not intern any String
whose value is equal to "Cattie & Doggie", so s1.intern()
returns s1
.
I am not aware of any list of pre-interned Strings. Such a list will most likely be considered an implementation detail, which may vary on different JDK implementations and JDK versions, and should not be relied on.
s2.intern()
would return the instance referenced by s2
only if the String pool didn't contain a String
whose value is "java" prior to that call. The JDK classes intern some String
s before your code is executed. "java" must be one of them. Therefore, s2.intern()
returns the previously interned instance instead of s2
.
On the other hand, the JDK classes did not intern any String
whose value is equal to "Cattie & Doggie", so s1.intern()
returns s1
.
I am not aware of any list of pre-interned Strings. Such a list will most likely be considered an implementation detail, which may vary on different JDK implementations and JDK versions, and should not be relied on.
edited Mar 13 at 7:01
answered Mar 13 at 6:54
EranEran
292k37482564
292k37482564
thank you for the detailed explanation, so is it correct to say: s.intern() will return the original reference if the string is not interned but if it's already interned (in the constant pool) then it returns the reference in the constant pool?
– Hearen
Mar 13 at 7:06
@Hearen that's true, as the javadoc says - "When the intern method is invoked, if the pool already contains a string equal to this String object as determined bythe equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. "
– Eran
Mar 13 at 7:08
sorry to disrupt you again. If that's so then why the second why still returns atrue
? ... so confusing now... but when I replaced thenew StringBuilder().toString()
withnew String()
both of them will becomefalse
. So weird...
– Hearen
Mar 13 at 7:13
2
"any list of pre-interned Strings" would depend on which JDK classes your program happened to load as well.
– Alexey Romanov
Mar 13 at 8:13
2
@AlexeyRomanov and the launcher, e.g. the commonly used standard launcher loads the specfied main class and does agetMethod("main", String.class)
on it, thus “pre-interning” the string"main"
. A different launcher, e.g. a native launcher invoking the main method via JNI would behave differently. Likewise, the way command line options are processed may differ and hence, have different effect on the list of “pre-interned” strings.
– Holger
Mar 13 at 8:51
|
show 8 more comments
thank you for the detailed explanation, so is it correct to say: s.intern() will return the original reference if the string is not interned but if it's already interned (in the constant pool) then it returns the reference in the constant pool?
– Hearen
Mar 13 at 7:06
@Hearen that's true, as the javadoc says - "When the intern method is invoked, if the pool already contains a string equal to this String object as determined bythe equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. "
– Eran
Mar 13 at 7:08
sorry to disrupt you again. If that's so then why the second why still returns atrue
? ... so confusing now... but when I replaced thenew StringBuilder().toString()
withnew String()
both of them will becomefalse
. So weird...
– Hearen
Mar 13 at 7:13
2
"any list of pre-interned Strings" would depend on which JDK classes your program happened to load as well.
– Alexey Romanov
Mar 13 at 8:13
2
@AlexeyRomanov and the launcher, e.g. the commonly used standard launcher loads the specfied main class and does agetMethod("main", String.class)
on it, thus “pre-interning” the string"main"
. A different launcher, e.g. a native launcher invoking the main method via JNI would behave differently. Likewise, the way command line options are processed may differ and hence, have different effect on the list of “pre-interned” strings.
– Holger
Mar 13 at 8:51
thank you for the detailed explanation, so is it correct to say: s.intern() will return the original reference if the string is not interned but if it's already interned (in the constant pool) then it returns the reference in the constant pool?
– Hearen
Mar 13 at 7:06
thank you for the detailed explanation, so is it correct to say: s.intern() will return the original reference if the string is not interned but if it's already interned (in the constant pool) then it returns the reference in the constant pool?
– Hearen
Mar 13 at 7:06
@Hearen that's true, as the javadoc says - "When the intern method is invoked, if the pool already contains a string equal to this String object as determined bythe equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. "
– Eran
Mar 13 at 7:08
@Hearen that's true, as the javadoc says - "When the intern method is invoked, if the pool already contains a string equal to this String object as determined bythe equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. "
– Eran
Mar 13 at 7:08
sorry to disrupt you again. If that's so then why the second why still returns a
true
? ... so confusing now... but when I replaced the new StringBuilder().toString()
with new String()
both of them will become false
. So weird...– Hearen
Mar 13 at 7:13
sorry to disrupt you again. If that's so then why the second why still returns a
true
? ... so confusing now... but when I replaced the new StringBuilder().toString()
with new String()
both of them will become false
. So weird...– Hearen
Mar 13 at 7:13
2
2
"any list of pre-interned Strings" would depend on which JDK classes your program happened to load as well.
– Alexey Romanov
Mar 13 at 8:13
"any list of pre-interned Strings" would depend on which JDK classes your program happened to load as well.
– Alexey Romanov
Mar 13 at 8:13
2
2
@AlexeyRomanov and the launcher, e.g. the commonly used standard launcher loads the specfied main class and does a
getMethod("main", String.class)
on it, thus “pre-interning” the string "main"
. A different launcher, e.g. a native launcher invoking the main method via JNI would behave differently. Likewise, the way command line options are processed may differ and hence, have different effect on the list of “pre-interned” strings.– Holger
Mar 13 at 8:51
@AlexeyRomanov and the launcher, e.g. the commonly used standard launcher loads the specfied main class and does a
getMethod("main", String.class)
on it, thus “pre-interning” the string "main"
. A different launcher, e.g. a native launcher invoking the main method via JNI would behave differently. Likewise, the way command line options are processed may differ and hence, have different effect on the list of “pre-interned” strings.– Holger
Mar 13 at 8:51
|
show 8 more comments
When the intern() method is invoked on a String object it looks the string contained by this String object in the pool, if the string is found there then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
So java
string must already be in the pool. hence it is giving false.
You can print all strings in pool
How to print the whole String pool?
Here is an example to get all string if you are using openjdk.
I just tried with the example in github you enclosed, it seems not working though I added the dependency it requires$JAVA_HOME/lib/sa-jdi.jar
. As for the OS link, How to print the whole String pool?, it's not tested yet but looks so tricky. Thanks for the help :)
– Hearen
Mar 13 at 10:53
add a comment |
When the intern() method is invoked on a String object it looks the string contained by this String object in the pool, if the string is found there then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
So java
string must already be in the pool. hence it is giving false.
You can print all strings in pool
How to print the whole String pool?
Here is an example to get all string if you are using openjdk.
I just tried with the example in github you enclosed, it seems not working though I added the dependency it requires$JAVA_HOME/lib/sa-jdi.jar
. As for the OS link, How to print the whole String pool?, it's not tested yet but looks so tricky. Thanks for the help :)
– Hearen
Mar 13 at 10:53
add a comment |
When the intern() method is invoked on a String object it looks the string contained by this String object in the pool, if the string is found there then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
So java
string must already be in the pool. hence it is giving false.
You can print all strings in pool
How to print the whole String pool?
Here is an example to get all string if you are using openjdk.
When the intern() method is invoked on a String object it looks the string contained by this String object in the pool, if the string is found there then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
So java
string must already be in the pool. hence it is giving false.
You can print all strings in pool
How to print the whole String pool?
Here is an example to get all string if you are using openjdk.
edited Mar 13 at 10:41
Hearen
2,94511530
2,94511530
answered Mar 13 at 7:01
SunnySunny
9,13764680
9,13764680
I just tried with the example in github you enclosed, it seems not working though I added the dependency it requires$JAVA_HOME/lib/sa-jdi.jar
. As for the OS link, How to print the whole String pool?, it's not tested yet but looks so tricky. Thanks for the help :)
– Hearen
Mar 13 at 10:53
add a comment |
I just tried with the example in github you enclosed, it seems not working though I added the dependency it requires$JAVA_HOME/lib/sa-jdi.jar
. As for the OS link, How to print the whole String pool?, it's not tested yet but looks so tricky. Thanks for the help :)
– Hearen
Mar 13 at 10:53
I just tried with the example in github you enclosed, it seems not working though I added the dependency it requires
$JAVA_HOME/lib/sa-jdi.jar
. As for the OS link, How to print the whole String pool?, it's not tested yet but looks so tricky. Thanks for the help :)– Hearen
Mar 13 at 10:53
I just tried with the example in github you enclosed, it seems not working though I added the dependency it requires
$JAVA_HOME/lib/sa-jdi.jar
. As for the OS link, How to print the whole String pool?, it's not tested yet but looks so tricky. Thanks for the help :)– Hearen
Mar 13 at 10:53
add a comment |
String literals (those that are hardcoded like "a string") are already interned for you by the compiler. But those strings that are acquired programmatically are not, and will be interned only if you use .intern()
method.
Usually you don't intern strings manually, unless you know you will store in memory a large number of repeating strings, so you can save a lot of memory that way.
That is explained here:
What is Java String interning?
add a comment |
String literals (those that are hardcoded like "a string") are already interned for you by the compiler. But those strings that are acquired programmatically are not, and will be interned only if you use .intern()
method.
Usually you don't intern strings manually, unless you know you will store in memory a large number of repeating strings, so you can save a lot of memory that way.
That is explained here:
What is Java String interning?
add a comment |
String literals (those that are hardcoded like "a string") are already interned for you by the compiler. But those strings that are acquired programmatically are not, and will be interned only if you use .intern()
method.
Usually you don't intern strings manually, unless you know you will store in memory a large number of repeating strings, so you can save a lot of memory that way.
That is explained here:
What is Java String interning?
String literals (those that are hardcoded like "a string") are already interned for you by the compiler. But those strings that are acquired programmatically are not, and will be interned only if you use .intern()
method.
Usually you don't intern strings manually, unless you know you will store in memory a large number of repeating strings, so you can save a lot of memory that way.
That is explained here:
What is Java String interning?
edited Mar 14 at 0:29
Hearen
2,94511530
2,94511530
answered Mar 13 at 7:05
maslanmaslan
1,186923
1,186923
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55135968%2fthe-return-of-string-intern-explained%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown