Java程序反转字符串

时间:2020-01-09 10:35:33  来源:igfitidea点击:

在这篇文章中,我们将看到一个Java程序来就地反转String。如果按照就地算法的定义进行操作,它不会使用任何多余的空间,那么输入数据本身的空间将用于修改数据并产生输出。

现在我们知道String在Java中是不可变的,因此对原始String的任何修改都会导致创建新的String对象。这与就地算法不同,后者要求我们不要使用新的数据结构来产生输出。因此,从技术上讲,不可能在Java中使用就地算法来反转字符串,但是可以进一步扩展技术性,我们可以说原始字符串(如果不再使用)会被垃圾回收,无论如何我们都将保留单个字符串对象。牢记这一点,我们可以编写一个Java程序来就地反转String。

如果允许使用其他类,则可以使用两种方法来编写此程序,然后可以使用StringBuilder类及其方法。如果不允许使用任何Java库,则可以通过迭代String来实现。

使用StringBuilder反转字符串

这里要注意的一件事是,我们不需要迭代整个String,对于大小为n的String,我们只需迭代n / 2个String。由于在每个迭代中交换了第一个和最后一个字符,第二个和倒数第二个等等,因此在到达中间字符时,字符串已经反转。

下图显示了相同的内容

public class ReverseString {
  public static void main(String[] args) {
    String str = "Hello World";
    reverseString(str);
  }

  static void reverseString(String str) {
    StringBuilder sb = new StringBuilder(str);
    int n = sb.length();
    char temp;
    for (int i = 0; i < n / 2; i++) { 
      temp = sb.charAt(i);
      sb.setCharAt(i, sb.charAt(n - i - 1));
      sb.setCharAt(n - i - 1, temp);
    } 
    System.out.println("Reversed String- " + sb.toString());
  }
}

输出:

Reversed String- dlroW olleH

如我们所见,该程序StringBuilder类及其setCharAt()方法用于反转String。

使用字符数组反转字符串

每个String都在内部存储为char数组,因此我们可以获取该数组并将其反转,从而在此过程中反转String。该程序类似于在Java中就地反转数组。

public class ReverseString {
  public static void main(String[] args) {
    String str = "Hello World";
    reverseString(str);
  }

  static void reverseString(String str) {
    char[] charArr = str.toCharArray();
    int n = charArr.length;
    char temp;
    for (int i = 0; i < n / 2; i++) { 
      temp = charArr[i]; 
      // Swapping
      charArr[i] = charArr[n - i - 1]; 
      charArr[n - i - 1] = temp; 
    } 
    String rstr = new String(charArr);
    System.out.println("Reversed String- " + rstr);
  }
}

输出:

Reversed String- dlroW olleH

尽管反转的整个过程都是使用输入String(内部存储为char数组)本身的空间完成的,但是使用反转的char数组会创建一个新的String。以原始字符串将被垃圾回收为例,可以说我们只剩下一个对象。