How can I swap two characters in a String
? For example, "abcde"
will become "bacde"
.

- 1,925
- 3
- 19
- 36

- 377
- 1
- 3
- 3
-
Please remember that you have to return a new String, because java String's are immutable. – NomadMaker Dec 11 '20 at 12:28
16 Answers
Since String
objects are immutable, going to a char[]
via toCharArray
, swapping the characters, then making a new String
from char[]
via the String(char[])
constructor would work.
The following example swaps the first and second characters:
String originalString = "abcde";
char[] c = originalString.toCharArray();
// Replace with a "swap" function, if desired:
char temp = c[0];
c[0] = c[1];
c[1] = temp;
String swappedString = new String(c);
System.out.println(originalString);
System.out.println(swappedString);
Result:
abcde
bacde
-
3Nice. Not sure why I went straight to StringBuilder instead of thinking about a char array. – Jon Skeet Jun 05 '09 at 14:44
-
@Jon Skeet: My first thought was actually to build up a new String, but since the requirements were a swap, so I thought the char array would be easier. :) – coobird Jun 05 '09 at 14:45
-
Just to add, the String class uses a char[] to keep its string data internally. This can be seen from browsing the source for the OpenJDK. So it may be old-fashioned, but arrays are used in the String class itself. – coobird Jun 05 '09 at 15:22
-
Very nice! I like how you did this _without_ a `StringBuilder`. – Captain Jack Sparrow Mar 30 '20 at 15:02
'In' a string, you cant. Strings are immutable. You can easily create a second string with:
String second = first.replaceFirst("(.)(.)", "$2$1");

- 49,809
- 17
- 109
- 135
This has been answered a few times but here's one more just for fun :-)
public class Tmp {
public static void main(String[] args) {
System.out.println(swapChars("abcde", 0, 1));
}
private static String swapChars(String str, int lIdx, int rIdx) {
StringBuilder sb = new StringBuilder(str);
char l = sb.charAt(lIdx), r = sb.charAt(rIdx);
sb.setCharAt(lIdx, r);
sb.setCharAt(rIdx, l);
return sb.toString();
}
}
static String string_swap(String str, int x, int y)
{
if( x < 0 || x >= str.length() || y < 0 || y >= str.length())
return "Invalid index";
char arr[] = str.toCharArray();
char tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
return new String(arr);
}

- 111
- 1
- 1
String.toCharArray() will give you an array of characters representing this string.
You can change this without changing the original string (swap any characters you require), and then create a new string using String(char[]).
Note that strings are immutable, so you have to create a new string object.

- 268,207
- 37
- 334
- 440
Here is java sample code for swapping java chars recursively.. You can get full sample code at http://java2novice.com/java-interview-programs/string-reverse-recursive/
public String reverseString(String str){
if(str.length() == 1){
return str;
} else {
reverse += str.charAt(str.length()-1)
+reverseString(str.substring(0,str.length()-1));
return reverse;
}
}

- 31
- 2
Here's a solution with a StringBuilder
. It supports padding resulting strings with uneven string length with a padding character. As you've guessed this method is made for hexadecimal-nibble-swapping.
/**
* Swaps every character at position i with the character at position i + 1 in the given
* string.
*/
public static String swapCharacters(final String value, final boolean padding)
{
if ( value == null )
{
return null;
}
final StringBuilder stringBuilder = new StringBuilder();
int posA = 0;
int posB = 1;
final char padChar = 'F';
// swap characters
while ( posA < value.length() && posB < value.length() )
{
stringBuilder.append( value.charAt( posB ) ).append( value.charAt( posA ) );
posA += 2;
posB += 2;
}
// if resulting string is still smaller than original string we missed the last
// character
if ( stringBuilder.length() < value.length() )
{
stringBuilder.append( value.charAt( posA ) );
}
// add the padding character for uneven strings
if ( padding && value.length() % 2 != 0 )
{
stringBuilder.append( padChar );
}
return stringBuilder.toString();
}

- 932
- 2
- 20
- 38
public static String shuffle(String s) {
List<String> letters = Arrays.asList(s.split(""));
Collections.shuffle(letters);
StringBuilder t = new StringBuilder(s.length());
for (String k : letters) {
t.append(k);
}
return t.toString();
}

- 33,559
- 24
- 104
- 119

- 447
- 5
- 8
I think this should help.
import java.util.*;
public class StringSwap{
public static void main(String ar[]){
Scanner in = new Scanner(System.in);
String s = in.next();
System.out.println(new StringBuffer(s.substring(0,2)).reverse().toString().concat(s.substring(2)));
}
}

- 23
- 7
//this is a very basic way of how to order a string alpha-wise, this does not use anything fancy and is great for school use
package string_sorter;
public class String_Sorter {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String word = "jihgfedcba";
for (int endOfString = word.length(); endOfString > 0; endOfString--) {
int largestWord = word.charAt(0);
int location = 0;
for (int index = 0; index < endOfString; index++) {
if (word.charAt(index) > largestWord) {
largestWord = word.charAt(index);
location = index;
}
}
if (location < endOfString - 1) {
String newString = word.substring(0, location) + word.charAt(endOfString - 1) + word.substring(location + 1, endOfString - 1) + word.charAt(location);
word = newString;
}
System.out.println(word);
}
System.out.println(word);
}
}

- 2,330
- 1
- 13
- 27

- 1
s = s.substring(0, firstChar)
+s.charAt(secondChar)
+s.substring(firstChar + 1, secondChar)
+s.charAt(firstChar)
+s.substring(secondChar+1);

- 126
- 2
- 3
-
5Please add some textual explanation accompagnying your response. Only code responses may not be very clear. What are `firstChar`, `secondChar`...? Also, may be a minimal working example is a good choice of responses – Pat. ANDRIA Dec 11 '20 at 13:18
-
firstChar and secondChar represents the indexes of a string that being swap – Ayush Chauhan Dec 12 '20 at 19:15
private static void interchangeSpecificCharInString(String originalStr, String inter1, String inter2) {
List<Character> characterList = new ArrayList<>();
for (char c : originalStr.toCharArray()) {
characterList.add(c);
}
int index1 = characterList.indexOf(inter1.charAt(0));
int index2 = characterList.indexOf(inter2.charAt(0));
characterList.set(index1, inter2.charAt(0));
characterList.set(index2, inter1.charAt(0));
StringBuilder sb = new StringBuilder();
for (char c : characterList) {
sb.append(c);
}
System.out.println(sb.toString());
}
If the string that you want to pass on is "Random" then you want to interchange "R" and "m" then here the originalStr will be Random, inter1 will be R and inter2 will be m.
String.replaceAll() or replaceFirst()
String s = "abcde".replaceAll("ab", "ba")
Link to the JavaDocs String API

- 53,070
- 5
- 41
- 38
-
1This assumed that you will know the characters to be swapped ahead of time, which doesn't seem like a usable solution in most cases. – dreadwail Jun 05 '09 at 18:41
import java.io.*;
class swaping
{
public static void main(String args[])
{
String name="premkumarg";
int len=name.length();
char[] c = name.toCharArray();
for(int i=0;i<len-1;i=i+2)
{
char temp= c[i];
c[i]=c[i+1];
c[i+1]=temp;
}
System.out.println("Swapping string is: ");
System.out.println(c);
}
}

- 3,863
- 1
- 18
- 31

- 1
The following line of code will swap the first two characters in str
:
return str.charAt(1) + str.charAt(0) + str.substring(2);

- 971
- 1
- 11
- 28

- 27
- 2
-
-
2This produces a completely wrong result. Hint: computational operators of equal precedence are left associative in Java, as in nearly all programming languages ever. – dave_thompson_085 Aug 21 '16 at 14:20
-
//you can do that...Hint : that code work in case String length large than 2 >>>>>>>> >>>>>>>>>>>>>>> package to.pkgtry; import java.util.Scanner; public class ToTry { public static String swap(String str) { String ret = "" + str.charAt(1) + str.charAt(0) + str.substring(2) ; return ret ; } public static void main(String[] args) { String s = swap("abcg") ; System.out.println(s); } } – Esraa Hammad Sep 03 '16 at 19:13