在本文中,我们将向您展示几种在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 -> 5
0000 1010 = 10
0000 0101|0 = 10 >> 1 = 5 System.out.println(4>>1); // 4 -> 2
0000 0100 = 4
0000 0010|0 = 4 >> 1 = 2 System.out.println(100>>1); // 100 -> 50
0110 0100 = 100
00110 010|0 = 100 >> 1 = 50 System.out.println(7>>1); // 7 -> 3
0000 0111 = 7
0000 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 olleH

Java 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();
} //...
}

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

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

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

使用位运算、值交换等方式反转java字符串-共四种方法的更多相关文章

  1. Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次

    [请尊重原创版权,如需引用,请注明来源及地址] > 字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有以下五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现 ...

  2. {转}Java 字符串分割三种方法

    http://www.chenwg.com/java/java-%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%88%86%E5%89%B2%E4%B8%89%E7%A7%8D%E6%9 ...

  3. java解析XML四种方法

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML. XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便 ...

  4. Java学习之路:详细解释Java解析XML四种方法

    XML如今已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 对于XML本身的语法知识与技术细节,须要阅读相关的技术文献,这里面包含的内容有DO ...

  5. Java 字符串拼接四种方式的性能比较分析

    一.简单介绍 编写代码过程中,使用"+"和"contact"比较普遍,但是它们都不能满足大数据量的处理,一般情况下有一下四种方法处理字符串拼接,如下: 1. 加 ...

  6. php反转输出字符串(两种方法)

    //第一种方法 function fz($a){ echo strrev($a); } fz('adfjdlks'); echo '<br />';   //第二种方法 function ...

  7. 【Java必修课】通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  8. 通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  9. 两个变量交换的四种方法(Java)

    对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) class TestEV //创建一个类 { public static ...

随机推荐

  1. JS遍历对象的几种方法

    几天前一个小伙伴问我 Object.getOwnPropertyNames() 是干什么用的 平时还真没有使用到这个方法,一时不知如何回答 从方法名称来分析,应该是返回的是对象自身属性名组成的数组 那 ...

  2. 记录一次Flink作业异常的排查过程

    最近2周开始接手apache flink全链路监控数据的作业,包括指标统计,业务规则匹配等逻辑,计算结果实时写入elasticsearch. 昨天遇到生产环境有作业无法正常重启的问题,我负责对这个问题 ...

  3. rust 神奇的特质

    pub trait Summary { fn summarize_author(&self) -> String; fn summarize(&self) -> Strin ...

  4. Jenkins项目构建运行

    [准备环境] 继Jenkins环境搭建完成后,进行插件的管理 [思路] 项目顺序是,开发提交代码到代码仓库,测试通过Jenkins拉下开发的代码打包部署: 1.开发提交代码 2.Jenkins自动从代 ...

  5. Jmeter服务器监控技术

    meter-plugins.org推出了全新的Plugins Manager,对于其提供的插件进行了集中的管理, 将 ServerAgent-xxx.jar上传被测服务器解压 进入目录 ServerA ...

  6. 线程基础8-quene讲解

    PriorityBlockingQueue是一个基于优先级堆的无界的并发安全的优先级队列(FIFO),队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取 ...

  7. java中“”==“” equals hashcode的关系

    ava中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比 ...

  8. mysql性能优化总结(MySql避免重复插入记录的几种方法)

    如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了:(area,age,salary),(area,age).(area)三个索引,这被称为最佳左前缀特性.因此我们在创 ...

  9. JSP新闻显示

    MYSQL数据库创建新闻表,用户登陆时使用SERVLET获取用户名,效验通过后直接跳转新闻列表页面,JSP使用EL显示新闻列表 1.首先创建数据库及用户.新闻表 CREATE DATABASE /*! ...

  10. app之功能测试

    1 什么是APP测试? App测试就是软件工程师对这类应用软件进行功能测试,性能测试,安全性测试以及兼容性测试等. 对于app测试我们一般采用的是黑盒测试方法,也会在必要的时候进行自动化测试以及性能测 ...