JAVA实现字符串反转(Reverse)的方法(没有最快,只有更快)
字符串反转在Java程序笔试面试中经常遇到,程序出了满足设计需要外,往往我们还要考虑到性能及内存相关的问题,如果考虑到性能和内存相关的问题,在笔试或面试中更容易赢得考官的青睐。
不多说,给出我这边实现的几种方案:
方案一:
private static String reverse(String str) {if (str == null) {return null;}return new StringBuffer(str).reverse().toString();}
利用StringBuffer或StringBuilder自带reverse方法,简单!
方案二:
private static String reverse1(String str) {if (str == null) {return null;}String result = "";for (int i = str.length() - 1; i >= 0; i--) {result = result + str.charAt(i);}return result;}
利用String的charAt方法,逆序拼接。
方案三:
private static String reverse2(String str) {if (str == null) {return null;}String result = "";char[] chars = str.toCharArray();for (int i = chars.length - 1; i >= 0; i--) {result = result + chars[i];}return result;}
利用String的toCharArray方法,逆序拼接。
方案四:
private static String reverse4(String str) {if (str == null) {return null;}int stackSize = str.length();Stack theStack = new Stack();for (int i = 0; i < stackSize; i++) {theStack.push(str.charAt(i));}StringBuilder result = new StringBuilder();while (!theStack.isEmpty()) {char ch = (char) theStack.pop();result.append(ch);}return result.toString();}
利用栈,压栈出栈来逆序。
方案五:
private static String reverse4(String str) {if (str == null) {return null;}char[] chars = str.toCharArray();int n = chars.length - 1;for (int i = 0; i < chars.length / 2; i++) {char temp = chars[i];chars[i] = chars[n - i];chars[n - i] = temp;}return new String(chars);}
二分法逆序字符串数组。
以上方法是容易想到的,都可以实现字符串逆序的功能。我们可以测试下上述五种方法执行的效率。
import java.util.Random;
import java.util.Stack;public class TestStringReverse {public static void main(String[] args) {// 实例一个长度为100000的字符串String test = "";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < 100000; i++) {sb.append(random.nextInt(10));}test = sb.toString();// 方法1long start1 = System.nanoTime();String reverse1 = reverse1(test);System.out.println("reverse1 time = " + (System.nanoTime() - start1));// 方法2long start2 = System.nanoTime();String reverse2 = reverse2(test);System.out.println("reverse2 time = " + (System.nanoTime() - start2));// 方法3long start3 = System.nanoTime();String reverse3 = reverse3(test);System.out.println("reverse3 time = " + (System.nanoTime() - start3));// 方法4long start4 = System.nanoTime();String reverse4 = reverse4(test);System.out.println("reverse4 time = " + (System.nanoTime() - start4));// 方法5long start5 = System.nanoTime();String reverse5 = reverse5(test);System.out.println("reverse5 time = " + (System.nanoTime() - start5));System.out.println(test);System.out.println(reverse1);System.out.println(reverse2);System.out.println(reverse3);System.out.println(reverse4);System.out.println(reverse5);}private static String reverse1(String str) {if (str == null) {return null;}return new StringBuffer(str).reverse().toString();}private static String reverse2(String str) {if (str == null) {return null;}String result = "";for (int i = str.length() - 1; i >= 0; i--) {result = result + str.charAt(i);}return result;}private static String reverse3(String str) {if (str == null) {return null;}StringBuilder result = new StringBuilder();char[] chars = str.toCharArray();int endIndex = chars.length - 1;for (int i = endIndex; i >= 0; i--) {result.append(chars[i]);}return result.toString();}private static String reverse4(String str) {if (str == null) {return null;}int stackSize = str.length();Stack theStack = new Stack();for (int i = 0; i < stackSize; i++) {theStack.push(str.charAt(i));}StringBuilder result = new StringBuilder();while (!theStack.isEmpty()) {char ch = (char) theStack.pop();result.append(ch);}return result.toString();}private static String reverse5(String str) {if (str == null) {return null;}char[] chars = str.toCharArray();int n = chars.length - 1;int limit = chars.length / 2;for (int i = 0; i < limit; i++) {char temp = chars[i];chars[i] = chars[n - i];chars[n - i] = temp;}return new String(chars);}}
运行结果:(方法一到五对应时间分别为reverse1到reverse5,方法执行时间使用纳秒计时单位)
reverse1 time = 5624211
reverse2 time = 4089409874
reverse3 time = 2358496
reverse4 time = 14649641
reverse5 time = 1216452
因为测试时间具有随机性,所以测试多组,五种方法耗时关系:reverse2>reverse4>reverse1>reverse3>reverse5.
简单分析下:
Java官方API解释:
The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder
(or StringBuffer
) class and its append
method. String conversions are implemented through the method toString
, defined by Object
and inherited by all classes in Java. For additional information on string concatenation and conversion, see Gosling, Joy, and Steele, The Java Language Specification.
意思是:Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。 字符串连接是通过StringBuilder
(或StringBuffer
)类及其append
方法实现的。 另外字串在拼接生成新字串的时候,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多低。
所以:reverse2比reverse1耗时
方法三和方法四实现上其实也有字串的循环拼接,charAt的效率比char数组取指定index的字符效率低,且方法四多了栈操作比数组操作慢
所以:reverse4比reverse3耗时。
方法三和方法一比较,方法三主要是使用了StringBuilder
,StringBuilder效率高,但线程不安全。
所以:reverse1比reverse3耗时。
方法五比方法一要快,这个可以从StringBuffer源码上分析:
public AbstractStringBuilder reverse() {boolean hasSurrogates = false;int n = count - 1;for (int j = (n-1) >> 1; j >= 0; j--) {int k = n - j;char cj = value[j];char ck = value[k];value[j] = ck;value[k] = cj;if (Character.isSurrogate(cj) ||Character.isSurrogate(ck)) {hasSurrogates = true;}}if (hasSurrogates) {reverseAllValidSurrogatePairs();}return this;}/** Outlined helper method for reverse() */private void reverseAllValidSurrogatePairs() {for (int i = 0; i < count - 1; i++) {char c2 = value[i];if (Character.isLowSurrogate(c2)) {char c1 = value[i + 1];if (Character.isHighSurrogate(c1)) {value[i++] = c1;value[i] = c2;}}}}
可以看出,StringBuffer逆序也是基于char数组,循环次数(时间复杂度)比方法五要多。
所以:reverse1比reverse5耗时
最后,关于字符串逆序方法应该还有其他方法,后续如发现比方法五还高效的方法会补充。
备注:
1.大家如有更高效方法,请留言补充;
2.方法暂时未考虑空间复杂度,一般来说高效的方法或多或少空间复杂度高,即所谓的空间换时间。
JAVA实现字符串反转(Reverse)的方法(没有最快,只有更快)相关推荐
- 【学习笔记】0002. JAVA实现字符串反转(10种方法)
221117更新,突发奇想想试试各种反转方式的效率,调整代码,不断增长待反转的字符串位数. 其中,C2方法率先出局,当字符串长度为几千位时,C2方法内存溢出,注释掉,继续增长测试其他方法:B3方法当字 ...
- java字符串反转有哪些方法呢?
java中字符串反转是一个常见的题目,那么今天来总结一下在java中反转字符串的方法到底有哪些: 1.使用java库函数中的方法reverse() private static String reve ...
- java案例——字符串反转
java案例--字符串反转 1.需求: 定义一个方法,实现字符串反转.键盘录入一个字符串,调用该方法后,在控制台输出结果 例如,键盘录入abc,输出结果cba 2.思路: 1.键盘录入一个字符串,用S ...
- java实现字符串反转_java实现字符串反转案例
java实现字符串反转案例 发布时间:2020-09-22 02:42:01 来源:脚本之家 阅读:83 作者:star__king 本文实例为大家分享了java实现字符串反转的具体代码,供大家参考, ...
- Java实现数组反转翻转的方法
Java实现数组反转翻转的方法 [尊重 原创,转载请注明出处 ]http://blog.csdn.net/guyuealian/article/details/51113133 数组 ...
- Java去除字符串中空格的方法详解
昨天写了一个关于Excel文件处理的脚本,在字符串匹配功能上总是出现多余不正确的匹配,debug调试之后,发现一个坑. 代码中字符串使用了replaceAll()方法,去除了所有空格(其中包括:首尾空 ...
- php如何让字符串变运算公式,MySQL_使用java处理字符串公式运算的方法, 在改进一个关于合同的项 - phpStudy...
使用java处理字符串公式运算的方法 在改进一个关于合同的项目时,有个需求,就是由于合同中非数据项的计算公式会根据年份而进行变更,而之前是将公式硬编码到系统中的,只要时间一变,系统就没法使用了,因此要 ...
- Java中字符串反转的七种方法
突然在想,确实是浮躁了 字符串反转的七种方法: 在线代码: package test1;import java.util.Stack;public class Reverse {//方法一:递归+字符 ...
- java怎么实现字符串反转_Java多种方法实现字符串反转!
来自牛客网 题目描述 接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串.(字符串长度不超过1000). 示例 输入:abcdefg 输出:gfedcba 解决思路 (主函数中实现)1. ...
最新文章
- GMap.net 离线地图问题
- boost::hana::unfold_right用法的测试程序
- 【2018.4.21】模拟赛之二-ssl2403 蜡烛【贪心】
- Michael Dell承诺打造新的EMC/戴尔/VMware工程技术系统
- component多个 vue_Vue.js之组件(component)
- android 拦截webview加载url_android webview拦截post的请求
- 现有Android项目中集成Flutter/Flutter混合开发实战(一)
- python中 使用EVO工具 批量评估里程计 脚本
- 前端找实习岗的7条建议
- windows 下的CACTI的安装方法
- LAMP源码环境搭建
- 代驾APP开发多少钱才合适,你真知道吗
- matlab cui,阻力汽车论文,关于基于Matlab-CUI的汽车动力性相关参考文献资料-免费论文范文...
- java教程—入门—jaav简介
- 数据结构之链表(LinkedList详解)
- 灌南县计算机中专学校,江苏省灌南中等专业学校2021年有哪些专业
- GPS从入门到放弃(七) --- GPS卫星位置解算
- mythtype加载出错
- mysql笔记手写_MySQL自用笔记
- 帝国cms linux伪静态规则,置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客...