使用位運(yùn)算、值交換等方式反轉(zhuǎn)java字符串的多種方法(四種方法)

在本文中,我們將向您展示幾種在Java中將String類型的字符串字母倒序的幾種方法。
StringBuilder(str).reverse()char[]循環(huán)與值交換byte循環(huán)與值交換apache-commons-lang3
如果是為了進(jìn)行開發(fā),請(qǐng)選擇StringBuilder(str).reverse()API。出于學(xué)習(xí)的目的,我們可以研究char[]和byte方法,其中涉及到值互換和移位運(yùn)算技術(shù),這些技術(shù)對(duì)于了解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());
}
}
輸出結(jié)果
avaJ ni gnirtS a esreveR
2.char[]
首先,我們將字符串轉(zhuǎn)換為char數(shù)組,并逐個(gè)循環(huán)char數(shù)組,并使用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個(gè)循環(huán)(長度/ 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
------------------------------------
wppm3vysvbp 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()的內(nèi)部實(shí)現(xiàn)(UTF16內(nèi)容除外)。
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);
}
}
最令人困惑的部分是右移運(yùn)算符(length - 1) >> 1,這是什么意思?查看下面的8位示例,您可以找到規(guī)律嗎?
System.out.println(10>>1); // 10 -> 5
0000 1010 = 10
0000 0101|0 = 10 >> 1 = 5System.out.println(4>>1); // 4 -> 2
0000 0100 = 4
0000 0010|0 = 4 >> 1 = 2System.out.println(100>>1); // 100 -> 50
0110 0100 = 100
00110 010|0 = 100 >> 1 = 50System.out.println(7>>1); // 7 -> 3
0000 0111 = 7
0000 0011|1 = 7 >> 1 = 3
對(duì)于數(shù)字,每右移1位,金額將減少該值的一半并四舍五入。這(length - 1) >> 1試圖找出字符串的中間點(diǎn)。
number >> 1 = round_down(number/2) or Math.flooa(number/2)
值交換從內(nèi)部開始,然后擴(kuò)展到外部。
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
------------------------------------
wppm3vysvbp l r o W o l l e {H}
------------------------------------
{0} 1 2 3 4 5 6 7 8 9 {10}
------------------------------------
4. Apache commons-lang3
對(duì)于Apache commons-lang3庫,我們可以使用StringUtils.reverse反轉(zhuǎn)字符串和StringUtils.reverseDelimited反轉(zhuǎn)單詞。
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
}
}
輸出結(jié)果
avaJ dlroW olleH
Java World Hello
查看其源代碼,Apache-commons-lang3其實(shí)是使用new StringBuilder(str).reverse()來反轉(zhuǎn)字符串。
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();
}
//...
}
歡迎關(guān)注我的博客,里面有很多精品合集本文轉(zhuǎn)載注明出處(必須帶連接,不能只轉(zhuǎn)文字):字母哥博客。
覺得對(duì)您有幫助的話,幫我點(diǎn)贊、分享!您的支持是我不竭的創(chuàng)作動(dòng)力! 。另外,筆者最近一段時(shí)間輸出了如下的精品內(nèi)容,期待您的關(guān)注。
《Spring Security-JWT-OAuth2一本通》
《實(shí)戰(zhàn)前后端分離RBAC權(quán)限管理系統(tǒng)》
《實(shí)戰(zhàn)SpringCloud微服務(wù)從青銅到王者》
到此這篇關(guān)于使用位運(yùn)算、值交換等方式反轉(zhuǎn)java字符串-共四種方法的文章就介紹到這了,更多相關(guān)使用位運(yùn)算、值交換等方式反轉(zhuǎn)java字符串-共四種方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一鍵清除maven倉庫中下載失敗的jar包的實(shí)現(xiàn)方法
這篇文章主要介紹了一鍵清除maven倉庫中下載失敗的jar包的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
深入解讀 Spring Boot 生態(tài)之功能、組件與優(yōu)勢(shì)
本文將深入剖析 Spring Boot 的生態(tài)體系,包括其核心功能、生態(tài)組件以及在不同場(chǎng)景中的應(yīng)用,并附上一張 Spring Boot 生態(tài)系統(tǒng)圖,幫助開發(fā)者更直觀地理解 Spring Boot 的強(qiáng)大之處,感興趣的朋友一起看看吧2024-11-11
基于Java編寫一個(gè)PDF與Word文件轉(zhuǎn)換工具
前段時(shí)間一直使用到word文檔轉(zhuǎn)pdf或者pdf轉(zhuǎn)word,尋思著用Java應(yīng)該是可以實(shí)現(xiàn)的,于是花了點(diǎn)時(shí)間寫了個(gè)文件轉(zhuǎn)換工具,感興趣的可以了解一下2023-01-01
java?kafka如何動(dòng)態(tài)設(shè)置用戶讀寫權(quán)限
這篇文章主要介紹了java?kafka如何動(dòng)態(tài)設(shè)置用戶讀寫權(quán)限問題,具有很好的參考家價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
詳解Spring Boot 項(xiàng)目啟動(dòng)時(shí)執(zhí)行特定方法
這篇文章主要介紹了詳解Spring Boot 項(xiàng)目啟動(dòng)時(shí)執(zhí)行特定方法,Springboot給我們提供了兩種“開機(jī)啟動(dòng)”某些方法的方式:ApplicationRunner和CommandLineRunner。感興趣的小伙伴們可以參考一下2018-06-06
SpringBoot中@ComponentScan注解過濾排除不加載某個(gè)類的3種方法
這篇文章主要給大家介紹了關(guān)于SpringBoot中@ComponentScan注解過濾排除不加載某個(gè)類的3種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-07-07
springboot對(duì)接第三方微信授權(quán)及獲取用戶的頭像和昵稱等等
這篇文章主要介紹了springboot對(duì)接第三方微信授權(quán)及獲取用戶的頭像和昵稱等等,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
如何把springboot jar項(xiàng)目 改為war項(xiàng)目
這篇文章主要介紹了如何把springboot jar項(xiàng)目 改為war項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Java Fluent Mybatis實(shí)戰(zhàn)之構(gòu)建項(xiàng)目與代碼生成篇上
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個(gè)新的mybatis增強(qiáng)框架 fluent mybatis2021-10-10

