views:

7808

answers:

7

How do you concatenate characters in java? 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. I want to do System.out.println(char1+char2+char3... and create a String word like this.

I could do

System.out.print(char1);
System.out.print(char2);
System.out.print(char3);

But, this will only get me the characters in 1 line. I need it as a string. Any help would be appreciated.

Thanks

+11  A: 

Do you want to make a string out of them?

String s = new StringBuilder().append(char1).append(char2).append(char3).toString();

Note that

String b = "b";
String s = "a" + b + "c";

Actually compiles to

String s = new StringBuilder("a").append(b).append("c").toString();

Edit: as litb pointed out, you can also do this:

"" + char1 + char2 + char3;

That compiles to the following:

new StringBuilder().append("").append(c).append(c1).append(c2).toString();

Edit (2): Corrected string append comparison since, as cletus points out, a series of strings is handled by the compiler.

The purpose of the above is to illustrate what the compiler does, not to tell you what you should do.

Dustin
you are missing a toString() at the end of the first line of code.
Adrian
You are incorrect. "a" + "b" + "c" becomes "abc" at compile-time. Its only evaluated at runtime if at least one of these operands can't be determined at compile-time.
cletus
@Adrian thanks -- fixed
Dustin
@cletus I just checked and you're right about the "a" + "b" + "c". The same thing happens with literal chars, but not when using variable references. Thanks for enlightening me. :)
Dustin
A: 

You need a String object of some description to hold your array of concatenated chars, since the char type will hold only a single character. e.g.,

StringBuilder sb = new StringBuilder('a').append('b').append('c');
System.out.println(sb.toString);
Ewen Cartwright
Sorry but for constants this is bad advice. The compiler optimises "" + 'a' + 'b' at compile time but cannot optimise your version so its a runtime expression. If you're dealing with variable characters then this approach may have merit.
cletus
+1  A: 

You need to tell the compiler you want to do String concatenation by starting the sequence with a string, even an empty one. Like so:

System.out.println("" + char1 + char2 + char3...);
sblundy
+3  A: 

If you have a bunch of chars and want to concat them into a string, why not do

System.out.println("" + char1 + char2 + char3);

?

Johannes Schaub - litb
+7  A: 

I wasn't going to answer this question but there are two answers here (that are getting voted up!) that are just plain wrong. Consider these expressions:

String a = "a" + "b" + "c";
String b = System.getProperty("blah") + "b";

The first is evaluated at compile-time. The second is evaluated at run-time.

So never replace constant concatenations (of any type) with StringBuilder, StringBuffer or the like. Only use those where variables are invovled and generally only when you're appending a lot of operands or you're appending in a loop.

If the characters are constant, this is fine:

String s = "" + 'a' + 'b' + 'c';

If however they aren't, consider this:

String concat(char... chars) {
  if (chars.length == 0) {
    return "";
  }
  StringBuilder s = new StringBuilder(chars.length);
  for (char c : chars) {
    s.append(c);
  }
  return s.toString();
}

as an appropriate solution.

However some might be tempted to optimise:

String s = "Name: '" + name + "'"; // String name;

into this:

String s = new StringBuilder().append("Name: ").append(name).append("'").toString();

While this is well-intentioned, the bottom line is DON'T.

Why? As another answer correctly pointed out: the compiler does this for you. So in doing it yourself, you're not allowing the compiler to optimise the code or not depending if its a good idea, the code is harder to read and its unnecessarily complicated.

For low-level optimisation the compiler is better at optimising code than you are.

Let the compiler do its job. In this case the worst case scenario is that the compiler implicitly changes your code to exactly what you wrote. Concatenating 2-3 Strings might be more efficient than constructing a StringBuilder so it might be better to leave it as is. The compiler knows whats best in this regard.

cletus
indeed you are right. would be a bad design and silly if "a"+"b" created a stringbuilder. and i also agree that for only 1-5 concats, doing it with + is probably better than going into the hassle of creating a StringBuilder.
Johannes Schaub - litb
The compiler does that for you, but yes, in your last example, that is what the compiler outputs. I completely agree that you *shouldn't* do that yourself, but I do think it's important to understand what happens.
Dustin
I incorporated your suggestions into my answer.
Dustin
+1  A: 

You can use the String constructor.

System.out.println(new String(new char[]{a,b,c}));
Dennis Cheung
Or java.nio.CharBuffer.wrap(new char[] { a, b, c }). :)
Tom Hawtin - tackline
CharBuffer.wrap does not give String but CharBuffer, which implements CharSequence.
Dennis Cheung
+1  A: 

public class initials {

public static void main (String [] args) {

 char initialA = 'M';
 char initialB = 'P';
 char initialC = 'T';

 System.out.println("" + initialA + initialB + initialC );


}

}