An interview question: What's the number of String objects being created?Is an array a primitive type or an object (or something else entirely)?How do I create a Java string from the contents of a file?Creating multiline strings in JavaScriptCount the number of occurrences of a character in a string in JavascriptHow do I check if a string contains another string in Objective-C?Convert JS object to JSON stringConverting an object to a stringPythonic way to create a long multi-line stringWhy is String immutable in Java?Where is the new Object of String created when we concat using + operator
Understanding Parallelize methods
I don't have the theoretical background in my PhD topic. I can't justify getting the degree
Is it possible to perform a regression where you have an unknown / unknowable feature variable?
How to gently end involvement with an online community?
Does travel insurance for short flight delays exist?
Is "The life is beautiful" incorrect or just very non-idiomatic?
Prove your innocence
“T” in subscript in formulas
Converting a set into a string
Pythagorean triple with hypotenuse a power of 2
Architectural feasibility of a tiered circular stone keep
Immutable builder and updater
Is there any practical application for performing a double Fourier transform? ...or an inverse Fourier transform on a time-domain input?
Does norwegian.no airline overbook flights?
Examples of topos that are not ordinary spaces
Why did Khan ask Admiral James T. Kirk about Project Genesis?
I can see my two means are different. What information can a t test add?
Is using a hyperlink to close a modal a poor design decision?
How to determine car loan length as a function of how long I plan to keep a car
How to respectfully refuse to assist co-workers with IT issues?
Handling Disruptive Student on the Autistic Spectrum
Is “I am getting married with my sister” ambiguous?
Thank God it's Friday, tomorrow is THE weekend. Why the definite article?
Is gzip atomic?
An interview question: What's the number of String objects being created?
Is an array a primitive type or an object (or something else entirely)?How do I create a Java string from the contents of a file?Creating multiline strings in JavaScriptCount the number of occurrences of a character in a string in JavascriptHow do I check if a string contains another string in Objective-C?Convert JS object to JSON stringConverting an object to a stringPythonic way to create a long multi-line stringWhy is String immutable in Java?Where is the new Object of String created when we concat using + operator
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I was asked in an interview about the number of objects that will be created on the given problem:
String str1 = "First";
String str2 = "Second";
String str3 = "Third";
String str4 = str1 + str2 + str3;
So I am not sure that the answer I gave was correct or not.
I answered that there would be 6 objects created in the string pool.
3 would be for all three variables.
1 would be for str1 + str2
(let's say str
).
1 would be for str2 + str3
.
1 would be for the str + str3
(str = str1 + str2
).
Please help me out on this confusion.
java string string-concatenation string-pool string-building
New contributor
add a comment |
I was asked in an interview about the number of objects that will be created on the given problem:
String str1 = "First";
String str2 = "Second";
String str3 = "Third";
String str4 = str1 + str2 + str3;
So I am not sure that the answer I gave was correct or not.
I answered that there would be 6 objects created in the string pool.
3 would be for all three variables.
1 would be for str1 + str2
(let's say str
).
1 would be for str2 + str3
.
1 would be for the str + str3
(str = str1 + str2
).
Please help me out on this confusion.
java string string-concatenation string-pool string-building
New contributor
2
Why wouldstr2 + str3
be one of the objects?
– Jacob G.
8 hours ago
3
I am not entirely sure whether it is defined in the JLS, but when concatenatingString
s, the compiler normally generates aStringBuilder
to concatenate theString
s. I am not entirely sure how theStringBuilder
internally handles the concatenation, but I would say that at least fiveObject
s are created: one forstr1
tostr3
, oneStringBuilder
and the finalString
forString4
.
– Turing85
8 hours ago
Update: The JLS actually defines that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." In other words: without further information, the question cannot be definitively answered.
– Turing85
8 hours ago
Nothing against you, but I hate questions like that. What is the deeper meaning of such questions? Especially in an interview? What skills does the interviewer want to find out?
– RedCam
8 hours ago
if the first 3 variables were definedfinal
I would say no object is being created (at that code segment)
– Carlos Heuberger
7 hours ago
add a comment |
I was asked in an interview about the number of objects that will be created on the given problem:
String str1 = "First";
String str2 = "Second";
String str3 = "Third";
String str4 = str1 + str2 + str3;
So I am not sure that the answer I gave was correct or not.
I answered that there would be 6 objects created in the string pool.
3 would be for all three variables.
1 would be for str1 + str2
(let's say str
).
1 would be for str2 + str3
.
1 would be for the str + str3
(str = str1 + str2
).
Please help me out on this confusion.
java string string-concatenation string-pool string-building
New contributor
I was asked in an interview about the number of objects that will be created on the given problem:
String str1 = "First";
String str2 = "Second";
String str3 = "Third";
String str4 = str1 + str2 + str3;
So I am not sure that the answer I gave was correct or not.
I answered that there would be 6 objects created in the string pool.
3 would be for all three variables.
1 would be for str1 + str2
(let's say str
).
1 would be for str2 + str3
.
1 would be for the str + str3
(str = str1 + str2
).
Please help me out on this confusion.
java string string-concatenation string-pool string-building
java string string-concatenation string-pool string-building
New contributor
New contributor
edited 7 hours ago
Andrew Tobilko
32.9k10 gold badges53 silver badges102 bronze badges
32.9k10 gold badges53 silver badges102 bronze badges
New contributor
asked 8 hours ago
bhpshbhpsh
373 bronze badges
373 bronze badges
New contributor
New contributor
2
Why wouldstr2 + str3
be one of the objects?
– Jacob G.
8 hours ago
3
I am not entirely sure whether it is defined in the JLS, but when concatenatingString
s, the compiler normally generates aStringBuilder
to concatenate theString
s. I am not entirely sure how theStringBuilder
internally handles the concatenation, but I would say that at least fiveObject
s are created: one forstr1
tostr3
, oneStringBuilder
and the finalString
forString4
.
– Turing85
8 hours ago
Update: The JLS actually defines that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." In other words: without further information, the question cannot be definitively answered.
– Turing85
8 hours ago
Nothing against you, but I hate questions like that. What is the deeper meaning of such questions? Especially in an interview? What skills does the interviewer want to find out?
– RedCam
8 hours ago
if the first 3 variables were definedfinal
I would say no object is being created (at that code segment)
– Carlos Heuberger
7 hours ago
add a comment |
2
Why wouldstr2 + str3
be one of the objects?
– Jacob G.
8 hours ago
3
I am not entirely sure whether it is defined in the JLS, but when concatenatingString
s, the compiler normally generates aStringBuilder
to concatenate theString
s. I am not entirely sure how theStringBuilder
internally handles the concatenation, but I would say that at least fiveObject
s are created: one forstr1
tostr3
, oneStringBuilder
and the finalString
forString4
.
– Turing85
8 hours ago
Update: The JLS actually defines that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." In other words: without further information, the question cannot be definitively answered.
– Turing85
8 hours ago
Nothing against you, but I hate questions like that. What is the deeper meaning of such questions? Especially in an interview? What skills does the interviewer want to find out?
– RedCam
8 hours ago
if the first 3 variables were definedfinal
I would say no object is being created (at that code segment)
– Carlos Heuberger
7 hours ago
2
2
Why would
str2 + str3
be one of the objects?– Jacob G.
8 hours ago
Why would
str2 + str3
be one of the objects?– Jacob G.
8 hours ago
3
3
I am not entirely sure whether it is defined in the JLS, but when concatenating
String
s, the compiler normally generates a StringBuilder
to concatenate the String
s. I am not entirely sure how the StringBuilder
internally handles the concatenation, but I would say that at least five Object
s are created: one for str1
to str3
, one StringBuilder
and the final String
for String4
.– Turing85
8 hours ago
I am not entirely sure whether it is defined in the JLS, but when concatenating
String
s, the compiler normally generates a StringBuilder
to concatenate the String
s. I am not entirely sure how the StringBuilder
internally handles the concatenation, but I would say that at least five Object
s are created: one for str1
to str3
, one StringBuilder
and the final String
for String4
.– Turing85
8 hours ago
Update: The JLS actually defines that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." In other words: without further information, the question cannot be definitively answered.
– Turing85
8 hours ago
Update: The JLS actually defines that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." In other words: without further information, the question cannot be definitively answered.
– Turing85
8 hours ago
Nothing against you, but I hate questions like that. What is the deeper meaning of such questions? Especially in an interview? What skills does the interviewer want to find out?
– RedCam
8 hours ago
Nothing against you, but I hate questions like that. What is the deeper meaning of such questions? Especially in an interview? What skills does the interviewer want to find out?
– RedCam
8 hours ago
if the first 3 variables were defined
final
I would say no object is being created (at that code segment)– Carlos Heuberger
7 hours ago
if the first 3 variables were defined
final
I would say no object is being created (at that code segment)– Carlos Heuberger
7 hours ago
add a comment |
5 Answers
5
active
oldest
votes
With the given information, the question cannot be definitely answered. As is stated in the JLS, §15.18.1:
... To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.
This means that the answer depends at least on the concrete Java compiler used.
I think the best we can do is give an interval as answer:
- a smart compiler may be able to infer that
str1
tostr3
are never used and fold the concatenation during compilation, such that only oneString
-object is created (the one referenced bystr4
) - The maximum sensible number of
String
s created should be 5: one each forstr1
tostr3
, one fortmp = str1 + str2
and one forstr4 = tmp + str3
.
So... my answer would be "something between one to five String
-objects". As to the total number of objects created just for this operation... I do not know. This may also depend how exactly e.g. StringBuffer
is implemented.
As an aside: I wonder what the reason behind asking such questions is. Normally, one does not need to care about those details.
3
"I wonder what the reason behind asking such questions is." - It reminds me of the "I-read-it-yesterday-I-will-ask-it-tomorrow" type of interviewers
– Andrew Tobilko
7 hours ago
add a comment |
Java 8 will likely create 5 objects:
- 3 for the 3 variables
- 1 StringBuilder
- 1 for the concatenated String
With Java 9 things changed though and String concatenation does not use StringBuilder anymore.
3
Good answer, but for Java 8, I think you're overlooking the char[] object used by the implementation of StringBuilder.
– Andy Thomas
8 hours ago
1
stackoverflow.com/questions/12806739/…
– 17slim
8 hours ago
4
@3limin4t0r "char[]
is a primitive value" - Nope.
– Turing85
8 hours ago
2
@AndyThomas if you count the char[] you will end up with even more as also String uses char[] and some constructors also create copies of char[].
– Puce
8 hours ago
That's a good point actually, which leads me to believe @Turing85's answer is more correct without further clarification from the interviewers.
– 17slim
8 hours ago
|
show 2 more comments
It should be 5:
three for the three literals (assigned to
str1
,str2
andstr3
)one for
str1 + str2
one for
(result from the previous operation) + str3
(assigned tostr4
)
str1 + str2 will not be concatenated to a String in all Java since quite many years.
– Puce
8 hours ago
add a comment |
Any answer to your question will be dependant on the JVM implementation and the Java version currently being used. It's a stupid question to ask in an interview.
Java 1.8.0_201
On my machine, with Java 1.8.0_201, your snippet results in this bytecode
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 3
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 4
L4
LINENUMBER 19 L4
RETURN
which proves that 5 objects are being created (3 constant String
literals, 1 StringBuilder
, 1 dynamically produced String
instance by StringBuilder#toString
).
Java 12.0.2
On my machine, with Java 12.0.2, the bytecode is
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
ALOAD 1
ALOAD 2
ALOAD 3
INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
// handle kind 0x6 : INVOKESTATIC
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
// arguments:
"u0001u0001u0001"
]
ASTORE 4
L4
LINENUMBER 17 L4
RETURN
which magically changes "the correct answer" to 4 objects since there is no intermediate String[Buffer/Builder]
involved.
1
each string also contains abyte[]
, same forStringBuilder
(and first one will also create a staticbyte[0]
) and eventually (haven't checked) theStringBuilder
can create a new, bigger buffer (if needed) (just proving your 2nd sentence true)
– Carlos Heuberger
7 hours ago
thinking about it, isLDC
creating a (new) Object? or just using one? (the literal could have been used before)
– Carlos Heuberger
7 hours ago
add a comment |
Concatenation operation doesn't create those many String objects. It creates aStringBuilder
and then appends the strings. So there may be 5 objects,
3 (variables) + 1 (sb) + 1 (Concatenated string).
It might be 5.
– Nexevis
8 hours ago
As was stated many times, the JLS says that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." Emphasis is on may.
– Turing85
8 hours ago
@Turing85 agreed. Updated.
– javaaddict
7 hours ago
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
);
);
bhpsh is a new contributor. Be nice, and check out our Code of Conduct.
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%2f57630924%2fan-interview-question-whats-the-number-of-string-objects-being-created%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
With the given information, the question cannot be definitely answered. As is stated in the JLS, §15.18.1:
... To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.
This means that the answer depends at least on the concrete Java compiler used.
I think the best we can do is give an interval as answer:
- a smart compiler may be able to infer that
str1
tostr3
are never used and fold the concatenation during compilation, such that only oneString
-object is created (the one referenced bystr4
) - The maximum sensible number of
String
s created should be 5: one each forstr1
tostr3
, one fortmp = str1 + str2
and one forstr4 = tmp + str3
.
So... my answer would be "something between one to five String
-objects". As to the total number of objects created just for this operation... I do not know. This may also depend how exactly e.g. StringBuffer
is implemented.
As an aside: I wonder what the reason behind asking such questions is. Normally, one does not need to care about those details.
3
"I wonder what the reason behind asking such questions is." - It reminds me of the "I-read-it-yesterday-I-will-ask-it-tomorrow" type of interviewers
– Andrew Tobilko
7 hours ago
add a comment |
With the given information, the question cannot be definitely answered. As is stated in the JLS, §15.18.1:
... To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.
This means that the answer depends at least on the concrete Java compiler used.
I think the best we can do is give an interval as answer:
- a smart compiler may be able to infer that
str1
tostr3
are never used and fold the concatenation during compilation, such that only oneString
-object is created (the one referenced bystr4
) - The maximum sensible number of
String
s created should be 5: one each forstr1
tostr3
, one fortmp = str1 + str2
and one forstr4 = tmp + str3
.
So... my answer would be "something between one to five String
-objects". As to the total number of objects created just for this operation... I do not know. This may also depend how exactly e.g. StringBuffer
is implemented.
As an aside: I wonder what the reason behind asking such questions is. Normally, one does not need to care about those details.
3
"I wonder what the reason behind asking such questions is." - It reminds me of the "I-read-it-yesterday-I-will-ask-it-tomorrow" type of interviewers
– Andrew Tobilko
7 hours ago
add a comment |
With the given information, the question cannot be definitely answered. As is stated in the JLS, §15.18.1:
... To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.
This means that the answer depends at least on the concrete Java compiler used.
I think the best we can do is give an interval as answer:
- a smart compiler may be able to infer that
str1
tostr3
are never used and fold the concatenation during compilation, such that only oneString
-object is created (the one referenced bystr4
) - The maximum sensible number of
String
s created should be 5: one each forstr1
tostr3
, one fortmp = str1 + str2
and one forstr4 = tmp + str3
.
So... my answer would be "something between one to five String
-objects". As to the total number of objects created just for this operation... I do not know. This may also depend how exactly e.g. StringBuffer
is implemented.
As an aside: I wonder what the reason behind asking such questions is. Normally, one does not need to care about those details.
With the given information, the question cannot be definitely answered. As is stated in the JLS, §15.18.1:
... To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.
This means that the answer depends at least on the concrete Java compiler used.
I think the best we can do is give an interval as answer:
- a smart compiler may be able to infer that
str1
tostr3
are never used and fold the concatenation during compilation, such that only oneString
-object is created (the one referenced bystr4
) - The maximum sensible number of
String
s created should be 5: one each forstr1
tostr3
, one fortmp = str1 + str2
and one forstr4 = tmp + str3
.
So... my answer would be "something between one to five String
-objects". As to the total number of objects created just for this operation... I do not know. This may also depend how exactly e.g. StringBuffer
is implemented.
As an aside: I wonder what the reason behind asking such questions is. Normally, one does not need to care about those details.
edited 7 hours ago
answered 8 hours ago
Turing85Turing85
7,1863 gold badges19 silver badges42 bronze badges
7,1863 gold badges19 silver badges42 bronze badges
3
"I wonder what the reason behind asking such questions is." - It reminds me of the "I-read-it-yesterday-I-will-ask-it-tomorrow" type of interviewers
– Andrew Tobilko
7 hours ago
add a comment |
3
"I wonder what the reason behind asking such questions is." - It reminds me of the "I-read-it-yesterday-I-will-ask-it-tomorrow" type of interviewers
– Andrew Tobilko
7 hours ago
3
3
"I wonder what the reason behind asking such questions is." - It reminds me of the "I-read-it-yesterday-I-will-ask-it-tomorrow" type of interviewers
– Andrew Tobilko
7 hours ago
"I wonder what the reason behind asking such questions is." - It reminds me of the "I-read-it-yesterday-I-will-ask-it-tomorrow" type of interviewers
– Andrew Tobilko
7 hours ago
add a comment |
Java 8 will likely create 5 objects:
- 3 for the 3 variables
- 1 StringBuilder
- 1 for the concatenated String
With Java 9 things changed though and String concatenation does not use StringBuilder anymore.
3
Good answer, but for Java 8, I think you're overlooking the char[] object used by the implementation of StringBuilder.
– Andy Thomas
8 hours ago
1
stackoverflow.com/questions/12806739/…
– 17slim
8 hours ago
4
@3limin4t0r "char[]
is a primitive value" - Nope.
– Turing85
8 hours ago
2
@AndyThomas if you count the char[] you will end up with even more as also String uses char[] and some constructors also create copies of char[].
– Puce
8 hours ago
That's a good point actually, which leads me to believe @Turing85's answer is more correct without further clarification from the interviewers.
– 17slim
8 hours ago
|
show 2 more comments
Java 8 will likely create 5 objects:
- 3 for the 3 variables
- 1 StringBuilder
- 1 for the concatenated String
With Java 9 things changed though and String concatenation does not use StringBuilder anymore.
3
Good answer, but for Java 8, I think you're overlooking the char[] object used by the implementation of StringBuilder.
– Andy Thomas
8 hours ago
1
stackoverflow.com/questions/12806739/…
– 17slim
8 hours ago
4
@3limin4t0r "char[]
is a primitive value" - Nope.
– Turing85
8 hours ago
2
@AndyThomas if you count the char[] you will end up with even more as also String uses char[] and some constructors also create copies of char[].
– Puce
8 hours ago
That's a good point actually, which leads me to believe @Turing85's answer is more correct without further clarification from the interviewers.
– 17slim
8 hours ago
|
show 2 more comments
Java 8 will likely create 5 objects:
- 3 for the 3 variables
- 1 StringBuilder
- 1 for the concatenated String
With Java 9 things changed though and String concatenation does not use StringBuilder anymore.
Java 8 will likely create 5 objects:
- 3 for the 3 variables
- 1 StringBuilder
- 1 for the concatenated String
With Java 9 things changed though and String concatenation does not use StringBuilder anymore.
answered 8 hours ago
PucePuce
29.1k9 gold badges61 silver badges117 bronze badges
29.1k9 gold badges61 silver badges117 bronze badges
3
Good answer, but for Java 8, I think you're overlooking the char[] object used by the implementation of StringBuilder.
– Andy Thomas
8 hours ago
1
stackoverflow.com/questions/12806739/…
– 17slim
8 hours ago
4
@3limin4t0r "char[]
is a primitive value" - Nope.
– Turing85
8 hours ago
2
@AndyThomas if you count the char[] you will end up with even more as also String uses char[] and some constructors also create copies of char[].
– Puce
8 hours ago
That's a good point actually, which leads me to believe @Turing85's answer is more correct without further clarification from the interviewers.
– 17slim
8 hours ago
|
show 2 more comments
3
Good answer, but for Java 8, I think you're overlooking the char[] object used by the implementation of StringBuilder.
– Andy Thomas
8 hours ago
1
stackoverflow.com/questions/12806739/…
– 17slim
8 hours ago
4
@3limin4t0r "char[]
is a primitive value" - Nope.
– Turing85
8 hours ago
2
@AndyThomas if you count the char[] you will end up with even more as also String uses char[] and some constructors also create copies of char[].
– Puce
8 hours ago
That's a good point actually, which leads me to believe @Turing85's answer is more correct without further clarification from the interviewers.
– 17slim
8 hours ago
3
3
Good answer, but for Java 8, I think you're overlooking the char[] object used by the implementation of StringBuilder.
– Andy Thomas
8 hours ago
Good answer, but for Java 8, I think you're overlooking the char[] object used by the implementation of StringBuilder.
– Andy Thomas
8 hours ago
1
1
stackoverflow.com/questions/12806739/…
– 17slim
8 hours ago
stackoverflow.com/questions/12806739/…
– 17slim
8 hours ago
4
4
@3limin4t0r "
char[]
is a primitive value" - Nope.– Turing85
8 hours ago
@3limin4t0r "
char[]
is a primitive value" - Nope.– Turing85
8 hours ago
2
2
@AndyThomas if you count the char[] you will end up with even more as also String uses char[] and some constructors also create copies of char[].
– Puce
8 hours ago
@AndyThomas if you count the char[] you will end up with even more as also String uses char[] and some constructors also create copies of char[].
– Puce
8 hours ago
That's a good point actually, which leads me to believe @Turing85's answer is more correct without further clarification from the interviewers.
– 17slim
8 hours ago
That's a good point actually, which leads me to believe @Turing85's answer is more correct without further clarification from the interviewers.
– 17slim
8 hours ago
|
show 2 more comments
It should be 5:
three for the three literals (assigned to
str1
,str2
andstr3
)one for
str1 + str2
one for
(result from the previous operation) + str3
(assigned tostr4
)
str1 + str2 will not be concatenated to a String in all Java since quite many years.
– Puce
8 hours ago
add a comment |
It should be 5:
three for the three literals (assigned to
str1
,str2
andstr3
)one for
str1 + str2
one for
(result from the previous operation) + str3
(assigned tostr4
)
str1 + str2 will not be concatenated to a String in all Java since quite many years.
– Puce
8 hours ago
add a comment |
It should be 5:
three for the three literals (assigned to
str1
,str2
andstr3
)one for
str1 + str2
one for
(result from the previous operation) + str3
(assigned tostr4
)
It should be 5:
three for the three literals (assigned to
str1
,str2
andstr3
)one for
str1 + str2
one for
(result from the previous operation) + str3
(assigned tostr4
)
edited 8 hours ago
answered 8 hours ago
Laurenz AlbeLaurenz Albe
62.8k11 gold badges44 silver badges66 bronze badges
62.8k11 gold badges44 silver badges66 bronze badges
str1 + str2 will not be concatenated to a String in all Java since quite many years.
– Puce
8 hours ago
add a comment |
str1 + str2 will not be concatenated to a String in all Java since quite many years.
– Puce
8 hours ago
str1 + str2 will not be concatenated to a String in all Java since quite many years.
– Puce
8 hours ago
str1 + str2 will not be concatenated to a String in all Java since quite many years.
– Puce
8 hours ago
add a comment |
Any answer to your question will be dependant on the JVM implementation and the Java version currently being used. It's a stupid question to ask in an interview.
Java 1.8.0_201
On my machine, with Java 1.8.0_201, your snippet results in this bytecode
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 3
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 4
L4
LINENUMBER 19 L4
RETURN
which proves that 5 objects are being created (3 constant String
literals, 1 StringBuilder
, 1 dynamically produced String
instance by StringBuilder#toString
).
Java 12.0.2
On my machine, with Java 12.0.2, the bytecode is
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
ALOAD 1
ALOAD 2
ALOAD 3
INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
// handle kind 0x6 : INVOKESTATIC
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
// arguments:
"u0001u0001u0001"
]
ASTORE 4
L4
LINENUMBER 17 L4
RETURN
which magically changes "the correct answer" to 4 objects since there is no intermediate String[Buffer/Builder]
involved.
1
each string also contains abyte[]
, same forStringBuilder
(and first one will also create a staticbyte[0]
) and eventually (haven't checked) theStringBuilder
can create a new, bigger buffer (if needed) (just proving your 2nd sentence true)
– Carlos Heuberger
7 hours ago
thinking about it, isLDC
creating a (new) Object? or just using one? (the literal could have been used before)
– Carlos Heuberger
7 hours ago
add a comment |
Any answer to your question will be dependant on the JVM implementation and the Java version currently being used. It's a stupid question to ask in an interview.
Java 1.8.0_201
On my machine, with Java 1.8.0_201, your snippet results in this bytecode
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 3
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 4
L4
LINENUMBER 19 L4
RETURN
which proves that 5 objects are being created (3 constant String
literals, 1 StringBuilder
, 1 dynamically produced String
instance by StringBuilder#toString
).
Java 12.0.2
On my machine, with Java 12.0.2, the bytecode is
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
ALOAD 1
ALOAD 2
ALOAD 3
INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
// handle kind 0x6 : INVOKESTATIC
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
// arguments:
"u0001u0001u0001"
]
ASTORE 4
L4
LINENUMBER 17 L4
RETURN
which magically changes "the correct answer" to 4 objects since there is no intermediate String[Buffer/Builder]
involved.
1
each string also contains abyte[]
, same forStringBuilder
(and first one will also create a staticbyte[0]
) and eventually (haven't checked) theStringBuilder
can create a new, bigger buffer (if needed) (just proving your 2nd sentence true)
– Carlos Heuberger
7 hours ago
thinking about it, isLDC
creating a (new) Object? or just using one? (the literal could have been used before)
– Carlos Heuberger
7 hours ago
add a comment |
Any answer to your question will be dependant on the JVM implementation and the Java version currently being used. It's a stupid question to ask in an interview.
Java 1.8.0_201
On my machine, with Java 1.8.0_201, your snippet results in this bytecode
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 3
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 4
L4
LINENUMBER 19 L4
RETURN
which proves that 5 objects are being created (3 constant String
literals, 1 StringBuilder
, 1 dynamically produced String
instance by StringBuilder#toString
).
Java 12.0.2
On my machine, with Java 12.0.2, the bytecode is
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
ALOAD 1
ALOAD 2
ALOAD 3
INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
// handle kind 0x6 : INVOKESTATIC
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
// arguments:
"u0001u0001u0001"
]
ASTORE 4
L4
LINENUMBER 17 L4
RETURN
which magically changes "the correct answer" to 4 objects since there is no intermediate String[Buffer/Builder]
involved.
Any answer to your question will be dependant on the JVM implementation and the Java version currently being used. It's a stupid question to ask in an interview.
Java 1.8.0_201
On my machine, with Java 1.8.0_201, your snippet results in this bytecode
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 3
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 4
L4
LINENUMBER 19 L4
RETURN
which proves that 5 objects are being created (3 constant String
literals, 1 StringBuilder
, 1 dynamically produced String
instance by StringBuilder#toString
).
Java 12.0.2
On my machine, with Java 12.0.2, the bytecode is
L0
LINENUMBER 13 L0
LDC "First"
ASTORE 1
L1
LINENUMBER 14 L1
LDC "Second"
ASTORE 2
L2
LINENUMBER 15 L2
LDC "Third"
ASTORE 3
L3
LINENUMBER 16 L3
ALOAD 1
ALOAD 2
ALOAD 3
INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
// handle kind 0x6 : INVOKESTATIC
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
// arguments:
"u0001u0001u0001"
]
ASTORE 4
L4
LINENUMBER 17 L4
RETURN
which magically changes "the correct answer" to 4 objects since there is no intermediate String[Buffer/Builder]
involved.
edited 7 hours ago
answered 7 hours ago
Andrew TobilkoAndrew Tobilko
32.9k10 gold badges53 silver badges102 bronze badges
32.9k10 gold badges53 silver badges102 bronze badges
1
each string also contains abyte[]
, same forStringBuilder
(and first one will also create a staticbyte[0]
) and eventually (haven't checked) theStringBuilder
can create a new, bigger buffer (if needed) (just proving your 2nd sentence true)
– Carlos Heuberger
7 hours ago
thinking about it, isLDC
creating a (new) Object? or just using one? (the literal could have been used before)
– Carlos Heuberger
7 hours ago
add a comment |
1
each string also contains abyte[]
, same forStringBuilder
(and first one will also create a staticbyte[0]
) and eventually (haven't checked) theStringBuilder
can create a new, bigger buffer (if needed) (just proving your 2nd sentence true)
– Carlos Heuberger
7 hours ago
thinking about it, isLDC
creating a (new) Object? or just using one? (the literal could have been used before)
– Carlos Heuberger
7 hours ago
1
1
each string also contains a
byte[]
, same for StringBuilder
(and first one will also create a static byte[0]
) and eventually (haven't checked) the StringBuilder
can create a new, bigger buffer (if needed) (just proving your 2nd sentence true)– Carlos Heuberger
7 hours ago
each string also contains a
byte[]
, same for StringBuilder
(and first one will also create a static byte[0]
) and eventually (haven't checked) the StringBuilder
can create a new, bigger buffer (if needed) (just proving your 2nd sentence true)– Carlos Heuberger
7 hours ago
thinking about it, is
LDC
creating a (new) Object? or just using one? (the literal could have been used before)– Carlos Heuberger
7 hours ago
thinking about it, is
LDC
creating a (new) Object? or just using one? (the literal could have been used before)– Carlos Heuberger
7 hours ago
add a comment |
Concatenation operation doesn't create those many String objects. It creates aStringBuilder
and then appends the strings. So there may be 5 objects,
3 (variables) + 1 (sb) + 1 (Concatenated string).
It might be 5.
– Nexevis
8 hours ago
As was stated many times, the JLS says that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." Emphasis is on may.
– Turing85
8 hours ago
@Turing85 agreed. Updated.
– javaaddict
7 hours ago
add a comment |
Concatenation operation doesn't create those many String objects. It creates aStringBuilder
and then appends the strings. So there may be 5 objects,
3 (variables) + 1 (sb) + 1 (Concatenated string).
It might be 5.
– Nexevis
8 hours ago
As was stated many times, the JLS says that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." Emphasis is on may.
– Turing85
8 hours ago
@Turing85 agreed. Updated.
– javaaddict
7 hours ago
add a comment |
Concatenation operation doesn't create those many String objects. It creates aStringBuilder
and then appends the strings. So there may be 5 objects,
3 (variables) + 1 (sb) + 1 (Concatenated string).
Concatenation operation doesn't create those many String objects. It creates aStringBuilder
and then appends the strings. So there may be 5 objects,
3 (variables) + 1 (sb) + 1 (Concatenated string).
edited 7 hours ago
answered 8 hours ago
javaaddictjavaaddict
1371 silver badge8 bronze badges
1371 silver badge8 bronze badges
It might be 5.
– Nexevis
8 hours ago
As was stated many times, the JLS says that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." Emphasis is on may.
– Turing85
8 hours ago
@Turing85 agreed. Updated.
– javaaddict
7 hours ago
add a comment |
It might be 5.
– Nexevis
8 hours ago
As was stated many times, the JLS says that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." Emphasis is on may.
– Turing85
8 hours ago
@Turing85 agreed. Updated.
– javaaddict
7 hours ago
It might be 5.
– Nexevis
8 hours ago
It might be 5.
– Nexevis
8 hours ago
As was stated many times, the JLS says that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." Emphasis is on may.
– Turing85
8 hours ago
As was stated many times, the JLS says that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." Emphasis is on may.
– Turing85
8 hours ago
@Turing85 agreed. Updated.
– javaaddict
7 hours ago
@Turing85 agreed. Updated.
– javaaddict
7 hours ago
add a comment |
bhpsh is a new contributor. Be nice, and check out our Code of Conduct.
bhpsh is a new contributor. Be nice, and check out our Code of Conduct.
bhpsh is a new contributor. Be nice, and check out our Code of Conduct.
bhpsh is a new contributor. Be nice, and check out our Code of Conduct.
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%2f57630924%2fan-interview-question-whats-the-number-of-string-objects-being-created%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
2
Why would
str2 + str3
be one of the objects?– Jacob G.
8 hours ago
3
I am not entirely sure whether it is defined in the JLS, but when concatenating
String
s, the compiler normally generates aStringBuilder
to concatenate theString
s. I am not entirely sure how theStringBuilder
internally handles the concatenation, but I would say that at least fiveObject
s are created: one forstr1
tostr3
, oneStringBuilder
and the finalString
forString4
.– Turing85
8 hours ago
Update: The JLS actually defines that "a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression." In other words: without further information, the question cannot be definitively answered.
– Turing85
8 hours ago
Nothing against you, but I hate questions like that. What is the deeper meaning of such questions? Especially in an interview? What skills does the interviewer want to find out?
– RedCam
8 hours ago
if the first 3 variables were defined
final
I would say no object is being created (at that code segment)– Carlos Heuberger
7 hours ago