在本文中,咱们将向您展现几种在Java中将String类型的字符串字母倒序的几种办法。

  • StringBuilder(str).reverse()
  • char[]循环与值替换
  • byte循环与值替换
  • apache-commons-lang3

如果是为了进行开发,请抉择StringBuilder(str).reverse()API。出于学习的目标,咱们能够钻研char[]byte办法,其中波及到值调换和移位运算技术,这些技术对于理解StringBuilder(str).reverse()API黑匣子背地原理十分有帮忙。

1. StringBuilder(str).reverse()

在Java中,咱们能够应用StringBuilder(str).reverse()使字符串字母倒序。

public class ReverseString1 {    public static void main(String[] args) {        String str = "Reverse a String in Java";        StringBuilder sb = new StringBuilder(str).reverse();        System.out.println(sb.toString());    }}

输入后果

avaJ ni gnirtS a esreveR

2.char[]

首先,咱们将字符串转换为char数组,并一一循环char数组,并应用temp变量替换值。

public class ReverseString2 {    public static void main(String[] args) {        String str = "Hello World";        System.out.println(reverse(str));         //  dlroW olleH    }    public static String reverse(String input) {        if (input == null || input.length() < 0)            throw new IllegalArgumentException("Please provide an input!");        char[] result = input.toCharArray();        int startIndex = 0;        int endIndex = result.length - 1;        char temp;        for (; endIndex > startIndex; startIndex++, endIndex--) {            temp = result[startIndex];            result[startIndex] = result[endIndex];            result[endIndex] = temp;        }        return new String(result);    }}

下面的算法须要5个循环(长度/ 2)来使字符串倒序“ Hello World”。

------------------------------------H  e  l  l  o     W  o  r  l  d------------------------------------0  1  2  3  4  5  6  7  8  9  10------------------------------------Loop #1 - Swap index 0 <-> index 10------------------------------------{d}  e  l  l  o     W  o  r  l  {H}------------------------------------{0}  1  2  3  4  5  6  7  8  9  {10}------------------------------------Loop #2 - Swap index 1 <-> index 9------------------------------------d  {l}  l  l  o     W  o  r  {e}  H------------------------------------0  {1}  2  3  4  5  6  7  8  {9}  10------------------------------------Loop #3 - Swap index 2 <-> index 8------------------------------------d  l  {r}  l  o     W  o  {l}  e  H------------------------------------0  1  {2}  3  4  5  6  7  {8}  9  10------------------------------------Loop #4 - Swap index 3 <-> index 7------------------------------------d  l  r  {o}  o     W  {l}  l  e  H------------------------------------0  1  2  {3}  4  5  6  {7}  8  9  10------------------------------------Loop #5 - Swap index 4 <-> index 6------------------------------------d  l  r  o  {W}     {o}  l  l  e  H------------------------------------0  1  2  3  {4}  5  {6}  7  8  9  10------------------------------------

3. Byte[] – StringBuilder(str).reverse(str)

以下代码段相似于StringBuilder(str).reverse()的外部实现(UTF16内容除外)。

import java.nio.charset.StandardCharsets;public class ReverseString3 {    public static void main(String[] args) {        String str = "Hello World";        System.out.println(reverse(str));    }    public static String reverse(String input) {        if (input == null || input.length() < 0)            throw new IllegalArgumentException("Please provide an input!");        byte[] val = input.getBytes(StandardCharsets.UTF_8);        int length = val.length - 1;        for (int start = (length - 1) >> 1; start >= 0; start--) {            int end = length - start;            byte temp = val[start];            val[start] = val[end];            val[end] = temp;            // debugging            //System.out.println(String.format("start=%s, end=%s", start, end));        }        return new String(val);    }}

最令人困惑的局部是右移运算符(length - 1) >> 1,这是什么意思?查看上面的8位示例,您能够找到法则吗?

System.out.println(10>>1);  //  10 -> 50000 1010   = 100000 0101|0 = 10 >> 1 = 5System.out.println(4>>1);   //  4 -> 20000 0100   = 40000 0010|0 = 4 >> 1 = 2System.out.println(100>>1); //  100 -> 500110 0100   = 10000110 010|0 = 100 >> 1 = 50System.out.println(7>>1);   //  7 -> 30000 0111   = 70000 0011|1 = 7 >> 1 = 3

对于数字,每右移1位,金额将缩小该值的一半并四舍五入。这(length - 1) >> 1试图找出字符串的两头点。

number >> 1 = round_down(number/2) or Math.flooa(number/2)

值替换从外部开始,而后扩大到内部。

for (int start = (length - 1) >> 1; start >= 0; start--) {    int end = length - start;    byte temp = val[start];    val[start] = val[end];    val[end] = temp;}

下面的算法图示如下:

------------------------------------H  e  l  l  o     W  o  r  l  d------------------------------------0  1  2  3  4  5  6  7  8  9  10------------------------------------Loop #1 - Swap index 4 <-> index 6------------------------------------H  e  l  l  {W}     {o}  o  r  l  d------------------------------------0  1  2  3  {4}  5  {6}  7  8  9  10------------------------------------Loop #2 - Swap index 3 <-> index 7------------------------------------H  e  l  {o}  W     o  {l}  r  l  d------------------------------------0  1  2  {3}  4  5  6  {7}  8  9  10------------------------------------Loop #3 - Swap index 2 <-> index 8------------------------------------H  e  {r}  o  W     o  l  {l}  l  d------------------------------------0  1  {2}  3  4  5  6  7  {8}  9  10------------------------------------Loop #4 - Swap index 1 <-> index 9------------------------------------H  {l}  r  o  W     o  l  l  {e}  d------------------------------------0  {1}  2  3  4  5  6  7  8  {9}  10------------------------------------Loop #5 - Swap index 0 <-> index 10------------------------------------{d}  l  r  o  W     o  l  l  e  {H}------------------------------------{0}  1  2  3  4  5  6  7  8  9  {10}------------------------------------

4. Apache commons-lang3

对于Apache commons-lang3库,咱们能够应用StringUtils.reverse反转字符串和StringUtils.reverseDelimited反转单词。

pom.xml

<dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-lang3</artifactId>    <version>3.10</version></dependency>
import org.apache.commons.lang3.StringUtils;public class ReverseString3 {    public static void main(String[] args) {        System.out.println(StringUtils.reverse("Hello World Java"));                // reverse string        System.out.println(StringUtils.reverseDelimited("Hello World Java", ' '));  // reverse words    }}

输入后果

avaJ dlroW olleHJava World Hello

查看其源代码,Apache-commons-lang3其实是应用new StringBuilder(str).reverse()来反转字符串。

package org.apache.commons.lang3;  public class StringUtils {  public static String reverse(final String str) {      if (str == null) {          return null;      }      return new StringBuilder(str).reverse().toString();  }  //...}

欢送关注我的博客,外面有很多精品合集

  • 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端拆散RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》