字符串反转及性能测试
来源:互联网 发布:软件人才需求量 编辑:程序博客网 时间:2024/05/01 21:45
方法一:
创建一个临时字符串temp, 通过charAt方法倒序获取字符串的字符。
String temp = "";String str = "我是中国人";int length = str.length();for (int j = length - 1; j >= 0; j--) {temp += str.charAt(j);}System.out.println(temp);
方法二:
参考StringBuffer和StringBuilder继承的抽象类AbstractStringBuilder的reverse方法实现。该方法采用的是折半算法,从中间开始置换
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; //判断字符是否属于Surrogate区 if (Character.isSurrogate(cj) || Character.isSurrogate(ck)) { hasSurrogates = true; } } if (hasSurrogates) { reverseAllValidSurrogatePairs(); } return this; }
一个完整的Unicode字符叫代码点CodePoint,而一个Java char叫代码单元code unit。如果String 对象以UTF-16保存 Unicode 字符,需要用2个字符表示一个超大字符集的汉字,这这种表示方式称之为 Surrogate,第一个字符叫Surrogate High,第二个就是Surrogate Low。
代码点(Code Point)就是指Unicode中为字符分配的编号,一个字符只占一个代码点,例如我们说到字符“汉”,它的代码点是U+6C49.代码单元(Code Unit)则是针对编码方法而言,它指的是编码方法中对一个字符编码以后所占的最小存储单元。 例如UTF-8中,代码单元是一个字节,因为一个字符可以被编码为1个,2个或者3个4个字节;在UTF-16中,代码单元变成了两个字节(就是一个 char),因为一个字符可以被编码为1个或2个char(你找不到比一个char还小的UTF-16编码的字符,嘿嘿)。说得再罗嗦一点,一个字符,仅仅对应一个代码点,但却可能有多个代码单元(即可能被编码为2个char)。
更多的参考:Java中的字符集编码入门
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; } } } }
简单的测试一下这两种方法:
方法一循环100w次:
测试代码:
long startTime1 = System.currentTimeMillis();for (int i = 0; i < 1000000; i++) {String temp = "";String str = "我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人";int length = str.length();for (int j = length - 1; j >= 0; j--) {temp += str.charAt(j);}System.out.println(temp);}long endTime1 = System.currentTimeMillis();System.out.println((endTime1 - startTime1) / 1000.0);结果:
方法二循环100w次:
测试代码:
long startTime = System.currentTimeMillis();for (int i = 0; i < 10000000; i++) {StringBuffer sb = new StringBuffer("我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人我是中国人");System.out.println(sb.reverse());}long endTime = System.currentTimeMillis();System.out.println((endTime - startTime) / 1000.0);结果:
可以看出,采用AbstractStringBuilder.reverse方法,内存使用率大大降低,打算买本算法的书学习学习,感觉好叼。
- 字符串反转及性能测试
- 实现数组反转及字符串反转的方法
- 字符串反转及数组奇偶划分
- 实现字符串的反转及替换
- 字符串的反转及用功能实现
- C++及C语言字符串反转
- 如何实现字符串的反转及替换?
- 如何实现字符串的反转及替换?
- 实现字符串的反转及替换
- c#字符串连接性能测试
- .net截取字符串性能测试
- 字符串反转,单词反转
- java字符串操作:如何实现字符串的反转及替换?
- 字符串反转
- 反转字符串
- 字符串反转
- 字符串反转
- 反转字符串
- mysql 命令行常用命令
- WordPress使用技巧(1)-禁用 Gravatar 头像
- swift 快速奔跑的兔几 本节的内容是:集合视图
- 整合Kafka到Spark Streaming——代码示例和挑战
- Android解析XML(PULL方式)和JSON 工作原理和实现过程(详细代码)
- 字符串反转及性能测试
- 关于Node里面的pause和pauseSchedulerAndActions
- HUST 1010 The Minimum Length
- 树的直径 poj1985 poj 1849 hdu 2196
- 黑马程序员——Java基础——网络编程
- 小马哥-----高仿苹果6s plus刷机拆机主板型号Q39主板图与开机界面图 分版本
- android adb logcat的经典用法
- Spring MVC框架及标签库
- 1016. 部分A+B (15)