实现字符串的反转。如:abcd 输出dcba

createh54周前 (04-09)技术教程9
public class StringReverse {

    // 方法1: 使用 StringBuilder 的 reverse() 方法 (推荐,高效简洁)
    public static String reverseStringStringBuilder(String str) {
        if (str == null) {
            return null; // 处理 null 输入
        }
        return new StringBuilder(str).reverse().toString();
    }

    // 方法2: 迭代方式 (更易理解,但效率略低于 StringBuilder)
    public static String reverseStringIterative(String str) {
        if (str == null) {
            return null; // 处理 null 输入
        }
        String reversedStr = ""; // 初始化空字符串用于存储反转后的字符串
        for (int i = str.length() - 1; i >= 0; i--) {
            reversedStr += str.charAt(i); // 从后向前遍历,逐个字符添加到新字符串
        }
        return reversedStr;
    }

    // 方法3: 使用字符数组 (思路类似迭代,但操作字符数组)
    public static String reverseStringCharArray(String str) {
        if (str == null) {
            return null; // 处理 null 输入
        }
        char[] charArray = str.toCharArray(); // 将字符串转换为字符数组
        int left = 0;
        int right = charArray.length - 1;
        while (left < right) {
            // 交换左右指针指向的字符
            char temp = charArray[left];
            charArray[left] = charArray[right];
            charArray[right] = temp;
            left++;
            right--;
        }
        return new String(charArray); // 将字符数组转换为字符串
    }

    public static void main(String[] args) {
        String inputString = "abcd";
        String reversedString1 = reverseStringStringBuilder(inputString);
        String reversedString2 = reverseStringIterative(inputString);
        String reversedString3 = reverseStringCharArray(inputString);

        System.out.println("原始字符串: " + inputString);
        System.out.println("使用 StringBuilder 反转: " + reversedString1); // 输出: dcba
        System.out.println("迭代方式反转: " + reversedString2);       // 输出: dcba
        System.out.println("字符数组方式反转: " + reversedString3);     // 输出: dcba

        String emptyString = "";
        System.out.println("\n原始字符串 (空字符串): " + emptyString);
        System.out.println("使用 StringBuilder 反转: " + reverseStringStringBuilder(emptyString)); // 输出: (空字符串)

        String nullString = null;
        System.out.println("\n原始字符串 (null): " + nullString);
        System.out.println("使用 StringBuilder 反转: " + reverseStringStringBuilder(nullString));   // 输出: null
    }
}

代码解释和方法比较:

1.
reverseStringStringBuilder(String str) (推荐方法):

  • 原理: 利用 StringBuilder 类提供的 reverse() 方法。StringBuilder 是可变的字符串,reverse() 方法直接在 StringBuilder 对象上进行反转操作,效率很高。
  • 步骤:if (str == null) { return null; }: 首先处理 null 输入,如果输入字符串为 null,则直接返回 null,避免 NullPointerException。new StringBuilder(str): 创建一个新的 StringBuilder 对象,并将输入的字符串 str 作为初始内容。.reverse(): 调用 StringBuilder 对象的 reverse() 方法,该方法会直接反转 StringBuilder 对象内部的字符序列。.toString(): 将反转后的 StringBuilder 对象转换回 String 对象,并返回。
  • 优点: 最简洁、最有效率 的方法。StringBuilder 的 reverse() 方法是专门为字符串反转设计的,性能最佳。
  • 缺点: 代码相对较少,可能不太直观地展示反转的逻辑过程。

2. reverseStringIterative(String str) (迭代方式):

  • 原理: 通过循环从字符串的末尾开始向前遍历,逐个字符添加到新的字符串中,从而实现反转。
  • 步骤:if (str == null) { return null; }: 处理 null 输入。String reversedStr = "";: 初始化一个空字符串 reversedStr,用于存储反转后的字符串。for (int i = str.length() - 1; i >= 0; i--) { ... }: 使用 for 循环,从字符串 str 的最后一个字符 (索引 str.length() - 1) 遍历到第一个字符 (索引 0)。reversedStr += str.charAt(i);: 在循环中,使用 str.charAt(i) 获取当前索引 i 处的字符,并使用 += 运算符将其追加到 reversedStr 的末尾。 注意: 在循环中使用 += 运算符拼接 String 在性能上不如 StringBuilder,因为每次 += 都会创建一个新的 String 对象。这里为了代码的易理解性使用了 String 拼接。return reversedStr;: 循环结束后,reversedStr 就包含了反转后的字符串,将其返回。
  • 优点: 代码逻辑清晰易懂,直接展示了字符串反转的迭代过程。
  • 缺点: 效率相对较低,尤其是在处理长字符串时,由于 String 的不可变性,每次 += 操作都会创建新的 String 对象,导致性能开销较大。

3. reverseStringCharArray(String str) (字符数组方式):

  • 原理: 将字符串转换为字符数组,然后使用双指针(左右指针)从数组两端向中间交换字符,实现数组的反转,最后将反转后的字符数组转换回字符串。
  • 步骤:if (str == null) { return null; }: 处理 null 输入。char[] charArray = str.toCharArray();: 使用 str.toCharArray() 将输入字符串 str 转换为字符数组 charArray。int left = 0; int right = charArray.length - 1;: 初始化左右指针 left 和 right,分别指向字符数组的起始和末尾位置。while (left < right) { ... }: 使用 while 循环,当左指针 left 小于右指针 right 时,循环继续。交换字符:
  • java复制代码
  • char temp = charArray[left]; charArray[left] = charArray[right]; charArray[right] = temp; 在循环中,交换 charArray[left] 和 charArray[right] 的值,实现字符交换。
  • 移动指针:
  • java复制代码
  • left++; right--; 将左指针 left 向右移动一位,将右指针 right 向左移动一位,逐步向数组中心靠近。
  • return new String(charArray);: 循环结束后,字符数组 charArray 就被反转了,使用 new String(charArray) 将字符数组转换为 String 对象并返回。
  • 优点: 思路清晰,使用了常见的双指针交换方法,展示了数组反转的逻辑。 效率比迭代拼接字符串的方式高,因为直接操作字符数组,避免了 String 的频繁创建。
  • 缺点: 代码相对 StringBuilder 方式稍显复杂。

性能比较:

  • StringBuilder.reverse() (方法1): 性能最佳,时间复杂度为 O(n),且 StringBuilder 内部操作效率高。
  • 字符数组方式 (方法3): 性能次之,时间复杂度也为 O(n),直接操作字符数组比 String 拼接效率高。
  • 迭代方式 (方法2): 性能相对较差,尤其是在处理长字符串时,由于 String 的不可变性,每次 += 操作都会创建新的 String 对象,时间复杂度接近 O(n^2) 在某些情况下。

推荐使用
reverseStringStringBuilder(String str) 方法,因为它最简洁、高效,并且是 Java 官方推荐的反转字符串的方式。
如果更注重代码的易理解性,或者需要展示字符串反转的逻辑过程,可以选择迭代方式或字符数组方式。

相关文章

JAVA 反转链表

输入一个链表,反转链表后,输出新链表的表头。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { t...

剑指Offer (十五):反转链表(Java版)

对于一个单向链表来说,上一条数据只能指向下一条数据(如下图),那我们想反转这个链表,变成下图这个样子,怎么实现呢?1->2->3->4->5 5->4->...

几经反转 谷歌胜诉后甲骨文能否接招?丨C位

超过十年的 Java 版权大战在几经反转之后,最终以谷歌的胜利告终。而之后,谷歌的母公司Alphabet还计划在未来几周停用甲骨文的财务软件。面对谷歌的“落井下石”,营收增速放缓的甲骨文能否接招?点击...

Java面试中常见的算法题型

Java面试中常见的算法题型各位小伙伴们,今天咱们来聊聊Java面试中那些让人“脑细胞爆炸”的算法题!这些题目看似简单,但如果你没做好准备,它们可能会像一条条调皮的小泥鳅一样从你的指缝中溜走。不过别担...

深度理解Spring IOC(控制反转)

一、IOC概述Inverse Of Controll即为控制反转,简称IOC 。简单来说,IOC反转了依赖关系的满足方式,由之前的自己创建依赖对象,变为由工厂推送。(变主动为被动,即反转)它解决了具有...