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

org.apache.commons

commons-lang3

3.10

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 字符串 移位_使用位运算、值交换等方式反转java字符串-共四种方法相关推荐

  1. delphi64位 char数组转换string中文乱码_使用位运算、值交换等方式反转java字符串-共四种方法...

    在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...

  2. java int越界_用位运算判断int类型变量越界

    今天在做一道oj题的时候,遇到了一个情景,需要判断经过操作后的int类型数是否越界.我直接很暴力地比较和int类型的最大最小值来判断是否越界.但还想思考一下用位运算判断是否越界的方法,顺便巩固一下位运 ...

  3. 电脑分辨率设置工具_干货分享:PPT 导出高清分辨率图片的四种方法

    PPT 不仅是办公神器,而且是科研作图的好工具. PPT 可以用来组图: 也可以绘制机制示意图: 以上都是我用 PPT 绘制出来的,今天不教大家怎么用 PPT 组图和绘制示意图,而是介绍从 PPT 中 ...

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

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

  5. Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串

    Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串 具体代码如下: package package2;import java.util.Scanner;/*** 加密可以这 ...

  6. Java中让浮点型数据保留两位小数的四种方法

    hello,你好呀,我是灰小猿,一个超会写bug的程序猿! 今天在进行开发的过程中遇到了一个小问题,是关于如何将double类型的数据保留两位小数.突然发现这方面有一点欠缺,就来总结一下. 一.Str ...

  7. java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...

  8. Java 判断字符串是否为空的四种方法、优缺点与注意事项

    以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...

  9. 【转】Java中字符串中子串的查找共有四种方法(indexof())

    原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下: 1.int ...

最新文章

  1. jQuery中的closest()和parents()的差别
  2. java listview控件_ListView普通列表控件的使用
  3. Android系统性能优化(46)---Android Lint
  4. Mongo DB命令简介
  5. AdaPrompt:进一步将下游任务融入到预训练模型
  6. thinkphp 框架两种模式 两种模式:开发调试模式、线上生产模式
  7. linux的系统监视器图片_Linux中一个高效的资源监控器Bpytop
  8. 疯狂java 李刚 pdf_Java开发教程 – 《疯狂Java讲义第4版》PDF及代码+李刚
  9. 计算机耗材管理系统,办公用品(消耗品)管理系统 单机版
  10. python实现车牌识别
  11. go模板引擎生成html,goweb-模板引擎
  12. 关于VGA接口连接1080p显示器模糊多半是线的问题
  13. 【分享】小米MIUI免root一键删除系统内置软件
  14. Java零基础学习-API每日单词(日更)
  15. 微信小程序开发费用一览表
  16. 华为外包的感受(CSDN)
  17. 页面访问量和网站访问量的统计
  18. CSS scroll-behavior 属性 — 纯 CSS 平滑滚动
  19. 在IE浏览器中实现网页自动翻译
  20. vs 调出控制台窗口

热门文章

  1. php curl伪装cookies,php curl 添加cookie伪造登陆抓取数据
  2. 如何在 Ubuntu 14.04 和 12.04 上测试 systemd
  3. c语言计算机培训,C语言计算机基础学习||新手入门必看
  4. 工业机器人打磨抛光编程员工资_一种工业机器人打磨抛光工作平台的制作方法...
  5. 360安全浏览器兼容模式怎么设置_测试新手一定要知道:最实用的Web兼容性测试经验都在这...
  6. react打包后图片丢失_React中型项目的优化实践
  7. 为什么写C语言弹不出窗口,居然还有SB说C写不出窗口的..
  8. 多核 linux 绑定,Linux 操作系统下CPU多核心的绑定
  9. 注入器 过检测_连云港管道检测服务
  10. java比较equlse_java基础知识要点