用StringBuilder和StringBuffer实现的Unicode解码方法的比较(Java)
初衷是用正则来写一个Unicode字符串转码的方法,一开始是打算结合StringBuilder写的,但是看到jdk7的Matcher.appendReplacement文档中一段示例代码用了Matcher.appendReplacement,原来已经有专门做替换用的方法了。
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());
但是印象中StringBuilder性能应该更好啊,因为StringBuffer用synchronized实现的,所以写了简单测试测了一下两种实现(测试环境是JDK7):
@Before
public void before(){
for (int i = 0; i < 100; i++) {
assertEquals(excepted, unicode2StringWithStringBuffer(input));
assertEquals(excepted, unicode2StringWithStringBuilder(input));
}
}
@Test
public void testUnicode2StringWithStringBuilder() {
long start = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
unicode2StringWithStringBuilder(input);
}
System.out.println(String.format("v1 StringBuilder %s takes: %s", COUNT, (System.currentTimeMillis() - start)));
}
@Test
public void testUnicode2StringWithStringBuffer() {
long start = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
unicode2StringWithStringBuffer(input);
}
System.out.println(String.format("v2 StringBuffer %s takes: %s", COUNT, (System.currentTimeMillis() - start)));
}
private static final int COUNT = 10000000;
private static final String excepted = "请求失败,参数错误:[action]";
private static final String input = "\u8bf7\u6c42\u5931\u8d25\uff0c\u53c2\u6570\u9519\u8bef:[action]";
private static final Pattern patternUnicode = Pattern.compile("\\\\u([0-9a-zA-Z]{4})");
private static String unicode2StringWithStringBuilder(final String unicode) {
if (unicode != null) {
try {
Matcher matcher = patternUnicode.matcher(unicode);
StringBuilder stringBuilder = new StringBuilder(unicode);
int offset = 0; //StringBuilder替换长度不等的字符产生的位置偏移
while (matcher.find()) {
String current = matcher.group();
String code = matcher.group(1);
String ch = String.valueOf((char) Integer.parseInt(code, 16));
stringBuilder.replace(matcher.start() + offset, matcher.end() + offset, ch);
offset += 1 - current.length(); //1为ch长度
}
return stringBuilder.toString();
} catch (Exception e) {
e.printStackTrace();
return unicode;
}
} else {
return unicode;
}
}
private static String unicode2StringWithStringBuffer(final String unicode) {
if (unicode != null) {
try {
Matcher matcher = patternUnicode.matcher(unicode);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, String.valueOf((char) Integer.parseInt(matcher.group(1), 16)));
}
matcher.appendTail(sb);
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return unicode;
}
} else {
return unicode;
}
}
1亿次和1千万次的执行结果分别是:
v2 StringBuffer 1000000 takes: 1815
v1 StringBuilder 1000000 takes: 1364
v2 StringBuffer 10000000 takes: 14107
v1 StringBuilder 10000000 takes: 13316
不知道这个测试科不科学,结果确实是StringBuilder快一些。
用StringBuilder和StringBuffer实现的Unicode解码方法的比较(Java)的更多相关文章
- 探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- 探秘Java中String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- java基础知识回顾之---java StringBuilder与StringBuffer异同点
/* * StringBuilder与StringBuffer异同点: * * 使用方法与StringBuffer完全一样 * Str ...
- 转发: 探秘Java中的String、StringBuilder以及StringBuffer
原文地址 探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家 ...
- 探秘Java中的String、StringBuilder以及StringBuffer(转载)
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...
- 使用StringBuilder或StringBuffer简单优化
使用StringBuilder或StringBuffer // join(["a", "b", "c"]) -> "a an ...
- 【转】探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
随机推荐
- 在SQL中用正则表达式替换html标签(2)
由于数据库的一个表字段中多包含html标签,现在需要修改数据库的字段把html标签都替换掉.当然我可以通过写一个程序去修改,那毕竟有点麻烦.直接在查询分析器中执行,但是MS SQL Server并没有 ...
- WPF加载程序集中字符串资源
WPF资源 WPF资源使用其实的也是resources格式嵌入资源,默认的资源名称为"应用程序名.g.resources",不过WPF资源使用的pack URI来访问资源. 添加图 ...
- springboot scheduled并发配置
本文介绍如何使用springboot的sheduled实现任务的定时调度,并将调度的任务实现为并发的方式. 1.定时调度配置scheduled 1)注册定时任务 package com.xiaoju. ...
- C# 相对路径转绝对路径
如果是路径相对路径,使用 Path 转换 System.IO.Path.Combine(文件夹, relativePath); 文件夹就是相对的文件夹. 这样就可以把相对路径转绝对. 参见:http: ...
- UVa10129,Play On Words
给出n个单词,如果一个单词的尾和另一个单词的头字符相等,那么可以相连,问这n个单词是否可以排成一列.欧拉路应用,构图:一个单词的头尾字母分别作为顶点,每输入一个word,该word的头指向word的尾 ...
- ADO.NET知识点
今天复习到了ADO.NET,就把他们的知识梳理总结出来 ADO.NET 是一组向 .NET 程序员公开数据访问服务的类.提供了对各种关系数据.XML 和应用程序数据的访问. 所有的数据访问类位于Sys ...
- [译]ASP.NET Core 2.0 全局配置项
问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...
- Spring源码情操陶冶-AOP之Advice通知类解析与使用
阅读本文请先稍微浏览下上篇文章Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器,本文则对aop模式的通知类作简单的分析 入口 根据前文讲解,我们知道通知类的 ...
- Msys2配置总结
一.MSYS2的MirrorList配置 1.修改msys2安装目录下的/etc/pacman.d文件夹里面的3个mirrorlist.*文件 [mirrorlist.mingw32] #中国科学技术 ...
- 微信小程序之页面跳转路径问题
错误如下: 业务需求:在movie页面点击进入detail页面. 在遍历跳转路径的时候,写绝对路径了 只需改一下就好了 教程参考地址:http://blog.csdn.net/reylen/artic ...