使用位运算、值交换等方式反转java字符串的多种方法(四种方法)

在本文中,我们将向您展示几种在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();
 }

 //...
}

欢迎关注我的博客,里面有很多精品合集本文转载注明出处(必须带连接,不能只转文字):字母哥博客

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

《手摸手教你学Spring Boot2.0》

《Spring Security-JWT-OAuth2一本通》

《实战前后端分离RBAC权限管理系统》

《实战SpringCloud微服务从青铜到王者》

《VUE深入浅出系列》

到此这篇关于使用位运算、值交换等方式反转java字符串-共四种方法的文章就介绍到这了,更多相关使用位运算、值交换等方式反转java字符串-共四种方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java反转字符串和相关字符编码的问题解决

    复制代码 代码如下: public String reverse(char[] value){       for (int i = (value.length - 1) >> 1; i >= 0; i--){           char temp = value[i];           value[i] = value[value.length - 1 - i];           value[value.length - 1 - i] = temp;       }     

  • java字符串反转示例分享

    思路: 将字符串变成数组,对数组反转将反转后的数组变成字符串只要将反转的部分的开始和结束的位置作为参数传递即可 复制代码 代码如下: class reverse_String{    public static void main (String[] args){        String s1 = "      java php .net    ";        String s2 = reverseString(s1);        System.out.println(s2

  • java 字符串反转的实例详解

    java 字符串反转的实例详解 1.new StringBuffer("abcde").reverse().toString(); 2.通过char数组进行转换, 代码如下 package com.test.reverse; public class TestReverse { public static void main(String[] args) { // 声明任意字符串 String str = "abcde"; //将字符串转换成char[] char[

  • Java 字符串反转实现代码

     Java 字符串反转 问题: 给一个字符串,比如 "I love china", 把字符反转后变成 "china love I" 思路: 先把字符串从第一个字符与最后一个字符对换,第二个字符和倒数第二个字符对换,这样,我们就把每一个单词位置互换了.但是我们要求单词里面字符的顺序是不能变的,所以,我们要把每一个单词里面的字符从头到尾对换一下.这样就可以得到我们想要的字符串了. 实现: 因为这里两次都会用到字符反转,所以我们就单独写一个swap的方法出来.我们对每个单

  • Java反转字符串的10种方法

    在这篇文章中,我们会讨论10种用Java反转字符串的方法,通过10个Java程序反转字符串.例如,把字符串"javaguides" 反转为 "sediugavaj". 1. 使用 + (String连接) 操作符 package net.javaguides.corejava.string; /** * * @author Ramesh Fadatare * */ public class ReverseWithStringConcat { public stati

  • 使用位运算、值交换等方式反转java字符串的多种方法(四种方法)

    在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换apache-commons-lang3 如果是为了进行开发,请选择StringBuilder(str).reverse()API.出于学习的目的,我们可以研究char[]和byte方法,其中涉及到值互换和移位运算技术,这些技术对于了解StringBuilder(str).reverse()API黑匣子背后

  • java读取XML文件的四种方法总结(必看篇)

    JAVA操作XML文档主要有四种方式,分别是DOM.SAX.JDOM和DOM4J,DOM和SAX是官方提供的,而JDOM和DOM4J则是引用第三方库的,其中用的最多的是DOM4J方式.运行效率和内存使用方面最优的是SAX,但是由于SAX是基于事件的方式,所以SAX无法在编写XML的过程中对已编写内容进行修改,但对于不用进行频繁修改的需求,还是应该选择使用SAX. 下面基于这四种方式来读取XML文件. 第一,以DOM的方式实现. package xmls; import org.w3c.dom.D

  • java调用WebService服务的四种方法总结

    目录 一.前言 二.简介   三.具体解析 第一种方式,首先得下载axis2的jar包,Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码. 第二种RPC 方式,强烈推荐. 第三种:利用HttpURLConnection拼接和解析报文进行调用. 第四种,利用httpclient 总结 一.前言 本来不想写这个的,因为网上类似的是在是太多了.但是想想自己前面段时间用过,而且以后可能再也没机会用了.所以还是记录一下吧.我这儿是以C语言生成的W

  • java获取当前时间的四种方法代码实例

    这篇文章主要介绍了java获取当前时间的四种方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一种:Date类 public class DateDemo { public static void main(String[] args) { Date day = new Date(); SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); S

  • Java中ArrayList初始化的四种方法详解

    1 起因 在实际业务开发中, 我们经常会遇到需要临时创建一个数组的情况, 今天我们就来讲一下Java中ArrayList初始化的方法 2 解决方案 直接上结论, 总共有四种初始化方法: 双括号法 Arrays.asList stream Lists 2.1 双括号法 List<Integer> test = new ArrayList<Integer>(){{ add(1); add(2); }}; 2.2 Arrays.asList List<Integer> tes

  • Java的引用类型常用的四种方法

    目录 前言 强引用FinalReference 软引用SoftReference 弱引用weakReference 虚引用PhantomReference 前言 今天看代码看到有牵扯到弱引用的东西,就先稍微补一补Java的四种引用类型吧.Java为引用类型专门定义了一个类Reference,它是引用对象的抽象基类. 这个类定义了所有引用对象共有的操作. 由于这个类和垃圾收集器是息息相关的,这个类不能直接子类化. Reference有4个子类,分别为强引用FinalReference.软引用Sof

  • java命令执行jar包的多种方法(四种方法)

    大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口. 具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件. 比如有个叫做test.jar的jar包,里面有一个拥有main函数的main class:test.someClassName 我们就只要在MANIFEST.MF里面添加如下一句话: Main-Class: test.someClassName 然后我们可以在控制台里输入java

  • Java 不使用第三方变量交换两个变量值的四种方法详解

    目录 变量本身交换数值 算术运算 指针地址操作 位运算 简单总结 哈喽,大家好,我是阿Q.前几天有个小伙伴去面试,被面试官的一个问题劝退了:请说出几种不使用第三方变量交换两个变量值的方法. 问题有点绕,好不容易缕清了面试官的问题,却发现答不上来.一时间尴尬无比,只能硬着头皮说不会. 遇到交换变量值的问题,通常我们的做法是:定义一个新的变量,借助它完成交换. 代码如下: t = a; a = b; b = t; 但问题的重点是"不使用第三方变量",那就变得"可爱"起来

  • 浅谈Java中浮点型数据保留两位小数的四种方法

    目录 一.String类的方式 二.DecimalFormat类 三.BigDecimal类进行数据处理 四.NumberFormat类进行数据处理 总结一下 今天在进行开发的过程中遇到了一个小问题,是关于如何将double类型的数据保留两位小数.突然发现这方面有一点欠缺,就来总结一下. 一.String类的方式 该方式是是使用String的format()方法来实现的,该方法的作用就是规范数据的格式,第一个参数传入一个字符串来表示输出的数据格式,如保留两位小数就使用"%.2f",第二

  • Java中保留两位小数的四种方法实现实例

    在写程序的时候,有时候可能需要设置小数的位数,那么java中有哪几种保留小数位数的方法呢?本文以两位小数为例给出四种方法. package CodeJava_Leet; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; /** * Created by Yechengpeng on 2016-08-14. */ public class Test { public

随机推荐