Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference when concatenating a String as a variable with a Character vs concatenating with an other String?

Tags:

When i see something (pseudo 1-liner) like this:

str1 + "a" + str2 

Is it much worse (or better/equal) than the following (pseudo 1-liner)?

str1 + 'a' + str2 

Update: Better example (by @QPaysTaxes) to reduce confusion regarding my original example.

What i tried: Various stuff for the past 10 years programming Java but i never managed to realy see whats under the hood - e.g. i would assume the second is slightly "faster/better" because there is no String-Object(s) created for the slash-sign and/or the garbage collector of Java has to handle less. I once prepared for the Java Certificates and might would have been able to argue better back in that time but it seems even thus its my daily business the "theory" about Java must be keept up to date as well... I know without any better explanation than my assumptation that indexOf('c') should be used rather than indexOf("C") and i wondered if the same counts for String-concatenation.

I also googled a bit but as my title might imply i am not quite good to describe what i am looking for without a example. I am sorry for this and the possibility this handicap just produced a duplicate.

What i will try: Based on the accepted answer here String concatenation: concat() vs "+" operator i hope to be able to have a start to see whats under the hood and one day be able to argue/ answer such questions that profund.

like image 760
JBA Avatar asked Mar 04 '15 13:03

JBA


People also ask

What is difference between string and concatenation?

Whenever a change to a String is made, an entirely new String is created. Concatenation is the process of joining end-to-end.

Can you concatenate a string and a character?

Concatenating strings would only require a + between the strings, but concatenating chars using + will change the value of the char into ascii and hence giving a numerical output.

What are the 2 methods used for string concatenation?

There are two ways to concatenate strings in Java: By + (String concatenation) operator. By concat() method.

What is the difference between concatenation and appending?

"Concatenate" joins two specific items together, whereas "append" adds what you specify to whatever may already be there.


2 Answers

Based on the accepted answer here I hope to be able to have a start to see whats under the hood.

Let's have a look at the generated bytecode when concatenating a String with a Character:

String str1 = "a" + "test"; String str2 = 'a' + "test"; 

0: ldc           #2                  // String atest 2: astore_1 3: ldc           #2                  // String atest 5: astore_2 

as you can see, there is no difference, the compiler will convert it to the same bytecode.

Now let's have a look at the generated bytecode when concatenating a Character to a String variable.

String str1 = "a" + str3; //str3 is a String String str2 = 'a' + str3;  

 7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V 10: ldc           #5                  // String a 12: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 15: aload_1 16: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 22: astore_2 23: new           #3                  // class java/lang/StringBuilder 26: dup 27: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V 30: bipush        97 32: invokevirtual #8                  // Method java/lang/StringBuilder.append:(C)Ljava/lang/StringBuilder; 35: aload_1 36: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 39: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 

As you can see, there is a little difference.

10: ldc           #5                  // String a 

ldc push a constant #index from a constant pool (String, int or float) onto the stack.

Therefore, if you are concatenating directly with a variable, concatenating a Character will generate less bytecode, that is what is under the hood.

Now for the performance issue, this wont represent any signifiant performance difference as the JIT compiler optimize most of the temporary objects, unless you specified when running your program to disable the JIT compiler using -Djava.compiler=NONE.

like image 190
Jean-François Savard Avatar answered Oct 11 '22 00:10

Jean-François Savard


I prefer to use "a" instead of 'a' to make sure the result is a String.

Consider this:

public static void main(String... args) {     String s = "foo";     int i = 1;     Object arg = s + '/' + i;     log(arg); }  private static void log(Object... args) {     MessageFormat format = new MessageFormat("bar {0}");     String message = format.format(args);     System.out.println(message); // or write to a log or something } 

Assume you decide you don’t need s in the message anymore and change the third line in the main method to:

Object arg = '/' + i; 

Then arg will contain just a number, because char + int does not concatenate, but add the values.

like image 32
Martin Avatar answered Oct 11 '22 00:10

Martin