Java8字符串分割的几种方式及性能比较
Posted 音译昌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8字符串分割的几种方式及性能比较相关的知识,希望对你有一定的参考价值。
一、方法
1、通过indexOf和substring这两个方法实现字符串分割
实现逻辑:
利用indexOf找出分割的字符在字符串中的位置,根据分割字符的位置切割字符串,再将分割好的字符串放进结果集。
实现代码如下:
/** * @Description: 通过indexof分割字符串 * @Param: [str, regx] * @return: java.lang.String[] * @Author: YinYichang * @Date: 2018/7/18 */ public static String[] splitByIndex(String str, String regx) { //字符串截取的开始位置 int begin = 0; //字符串截取的结束位置 int limit = 0; //截取分割得到的字符串 String splitStr = ""; ArrayList<String> result = new ArrayList<String>(); while (str.indexOf(regx) != -1) { //设置要截取的位置 limit = str.indexOf(regx); splitStr = str.substring(begin, limit); //设置截取后的字符串 str = str.substring(limit + 1, str.length()); result.add(splitStr); } if (!StringUtil.isBlank(str)) { result.add(str); } String[] strs = new String[result.size()]; return result.toArray(strs); }
2、通过charAt和substring这两个方法实现字符串分割
实现逻辑:
同上,通过charAt方法找出字符所在字符串中的位置,再实现如同方法1的逻辑即可得到分割后的字符串结果集。
实现代码如下:
/** * @Description: 通过charAt分割字符串 * @Param: [str, regx] * @return: java.lang.String[] * @Author: YinYichang * @Date: 2018/7/18 */ public static String[] splitByCharAt(String str, char regx) { //字符串截取的开始位置 int begin = 0; //截取分割得到的字符串 String splitStr = ""; ArrayList<String> result = new ArrayList<String>(); int length = str.length(); //计数器 int i = 0; for (i = 0; i < length;i++ ) { if (str.charAt(i) == regx) { splitStr = str.substring(begin, i); result.add(splitStr); str = str.substring(i + 1, length); length = str.length(); i = 0; } } if (!StringUtil.isBlank(str)) { result.add(str); } String[] strs = new String[result.size()]; return result.toArray(strs); }
3、通过java自带的split方法分割字符串
4、通过StringTokenizer对字符串进行分割
通过这种方法分割字符串的使用频率比较少,这种分割需要创建新的对象(对内存造成不必要的开支),虽然该方法提供了提取分割结果的方法,但是也比较麻烦并没有数组那么简单。
/** * @Description: 通过StringTokenizer分割字符串, 该方 * 法分割后将结果封装并提供相关方法提取(很少用到) * @Param: [str, regx] * @return: StringTokenizer * @Author: YinYichang * @Date: 2018/7/18 */ public static StringTokenizer splitByStringTokenizer(String str, String regx) { StringTokenizer stringTokenizer = new StringTokenizer(str, regx); return stringTokenizer; }
二、性能测试
由于StringTokenizer很少用到就不测试了,主要测试两种自定义的分割方法和java自带的方法。
测试代码如下:
String str = "a,b,c,d,e,f,g"; System.out.println("测试代码循环10000次。。。,结果如下:"); long length = 10000; //indexof字符串分割测试 long begin = System.currentTimeMillis(); for (int i = 0; i < length; i++) { String[] strs = SplitStr.splitByIndex(str, ","); } long end = System.currentTimeMillis(); System.out.println("indexof分割字符串返回数组用时:"+(end - begin)); //charAt字符串分割测试 begin = System.currentTimeMillis(); for (int i = 0; i < length; i++) { String[] strs = SplitStr.splitByCharAt(str, \',\'); } end = System.currentTimeMillis(); System.out.println("charAt分割字符串返回数组用时:"+(end - begin)); //split字符串分割测试 begin = System.currentTimeMillis(); for (int i = 0; i < length; i++) { String[] strs = str.split(","); } end = System.currentTimeMillis(); System.out.println("split分割字符串用时:"+(end - begin));
测试结果:
以上测试结果,分别对三种方法循环测试1000次、10000次和100000次,由结果可以看出利用charAt分割字符串的效率是最高的。
其实,查看split方法的实现代码后发现,split采用的分割方式是和自定义的第一种方式类似的,可以看出中两者的差距不是特别大。
代码优化任重道远,如有问题希望给与指正!
以上是关于Java8字符串分割的几种方式及性能比较的主要内容,如果未能解决你的问题,请参考以下文章
Bean复制的几种框架性能比较(Apache BeanUtilsPropertyUtils,Spring BeanUtils,Cglib BeanCopier)