字符串反转在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耗时。

方法三和方法一比较,方法三主要是使用了StringBuilderStringBuilder效率高,但线程不安全。

所以: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)的方法(没有最快,只有更快)相关推荐

  1. 【学习笔记】0002. JAVA实现字符串反转(10种方法)

    221117更新,突发奇想想试试各种反转方式的效率,调整代码,不断增长待反转的字符串位数. 其中,C2方法率先出局,当字符串长度为几千位时,C2方法内存溢出,注释掉,继续增长测试其他方法:B3方法当字 ...

  2. java字符串反转有哪些方法呢?

    java中字符串反转是一个常见的题目,那么今天来总结一下在java中反转字符串的方法到底有哪些: 1.使用java库函数中的方法reverse() private static String reve ...

  3. java案例——字符串反转

    java案例--字符串反转 1.需求: 定义一个方法,实现字符串反转.键盘录入一个字符串,调用该方法后,在控制台输出结果 例如,键盘录入abc,输出结果cba 2.思路: 1.键盘录入一个字符串,用S ...

  4. java实现字符串反转_java实现字符串反转案例

    java实现字符串反转案例 发布时间:2020-09-22 02:42:01 来源:脚本之家 阅读:83 作者:star__king 本文实例为大家分享了java实现字符串反转的具体代码,供大家参考, ...

  5. Java实现数组反转翻转的方法

    Java实现数组反转翻转的方法     [尊重 原创,转载请注明出处 ]http://blog.csdn.net/guyuealian/article/details/51113133      数组 ...

  6. Java去除字符串中空格的方法详解

    昨天写了一个关于Excel文件处理的脚本,在字符串匹配功能上总是出现多余不正确的匹配,debug调试之后,发现一个坑. 代码中字符串使用了replaceAll()方法,去除了所有空格(其中包括:首尾空 ...

  7. php如何让字符串变运算公式,MySQL_使用java处理字符串公式运算的方法,  在改进一个关于合同的项 - phpStudy...

    使用java处理字符串公式运算的方法 在改进一个关于合同的项目时,有个需求,就是由于合同中非数据项的计算公式会根据年份而进行变更,而之前是将公式硬编码到系统中的,只要时间一变,系统就没法使用了,因此要 ...

  8. Java中字符串反转的七种方法

    突然在想,确实是浮躁了 字符串反转的七种方法: 在线代码: package test1;import java.util.Stack;public class Reverse {//方法一:递归+字符 ...

  9. java怎么实现字符串反转_Java多种方法实现字符串反转!

    来自牛客网 题目描述 接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串.(字符串长度不超过1000). 示例  输入:abcdefg 输出:gfedcba 解决思路 (主函数中实现)1. ...

最新文章

  1. GMap.net 离线地图问题
  2. boost::hana::unfold_right用法的测试程序
  3. 【2018.4.21】模拟赛之二-ssl2403 蜡烛【贪心】
  4. Michael Dell承诺打造新的EMC/戴尔/VMware工程技术系统
  5. component多个 vue_Vue.js之组件(component)
  6. android 拦截webview加载url_android webview拦截post的请求
  7. 现有Android项目中集成Flutter/Flutter混合开发实战(一)
  8. python中 使用EVO工具 批量评估里程计 脚本
  9. 前端找实习岗的7条建议
  10. windows 下的CACTI的安装方法
  11. LAMP源码环境搭建
  12. 代驾APP开发多少钱才合适,你真知道吗
  13. matlab cui,阻力汽车论文,关于基于Matlab-CUI的汽车动力性相关参考文献资料-免费论文范文...
  14. java教程—入门—jaav简介
  15. 数据结构之链表(LinkedList详解)
  16. 灌南县计算机中专学校,江苏省灌南中等专业学校2021年有哪些专业
  17. GPS从入门到放弃(七) --- GPS卫星位置解算
  18. mythtype加载出错
  19. mysql笔记手写_MySQL自用笔记
  20. 帝国cms linux伪静态规则,置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客...

热门文章

  1. 程序员如何获得中级工程师高级工程师职称
  2. Smarty模板技术
  3. 使用腾讯云服务器快速搭建网站教程
  4. css如何设置超链接样式
  5. Linux DHCP配置
  6. 程序员面试及机考完全指南
  7. [记忆碎片的磁盘整理]爷爷奶奶
  8. 一家航空公司为了保障安全 用计算机,旅客运输组织复习题11
  9. java中反射到底是什么_JAVA中反射是什么
  10. 取证导论 Volatility入门使用——ctf公开课笔记记录