您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

用Java代码对字符串进行切割,这么写性能提升2倍

时间:2022-05-09 10:33:03  来源:  作者:石杉的架构笔记

今天给大家介绍一个小知识点,但是会非常的实用,就是平时我们写JAVA代码的时候,如果要对字符串进行切割,我们巧妙的运用一些技巧,可以把性能提升5~10倍。下面不说废话,直接来给大家上干货!

 

工作中常用的split()切割字符串效率高吗?

首先,我们用下面的一段代码,去拼接出来一个用逗号分隔的超长字符串,把从0开始一直到9999的每个数字都用逗号分隔,拼接成一个超长的字符串,以便于我们可以进行实验,代码如下所示:

public class StringSplitTest {

    public static void mAIn(String[] args) {
        String string = null;
        StringBuffer stringBuffer = new StringBuffer();

        int max = 10000;
        for(int i = 0; i < max; i++) {
            stringBuffer.Append(i);
            if(i < max - 1) {
                stringBuffer.append(",");
            }
        }
        string = stringBuffer.toString();
    }

}

接着我们可以用下面的代码来测试一下,如果用最基础的split方法来对超长字符串做切割,循环切割1w次,要耗费多长时间,看如下代码测试:

public class StringSplitTest {

    public static void main(String[] args) {
        String string = null;
        StringBuffer stringBuffer = new StringBuffer();

        int max = 10000;
        for(int i = 0; i < max; i++) {
            stringBuffer.append(i);
            if(i < max - 1) {
                stringBuffer.append(",");
            }
        }
        string = stringBuffer.toString();

        long start = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++) {
            string.split(",");
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

}

经过上面代码的测试,最终发现用split方法对字符串按照逗号进行切割,切割1w次是耗时2000多毫秒,这个不太固定,大概是2300毫秒左右

 

JDK提供字符串切割工具类StringTokenizer

接着给大家介绍另外一个性能更加好的专门用于字符串切割的工具类,就是StringTokenizer,这个工具是JDK提供的,也是专门用来进行字符串切割的,他的性能会更好一些,我们可以看下面的代码,用他来进行1w次字符串切割,看看具体的性能测试结果如何:

import java.util.StringTokenizer;

public class StringSplitTest {

    public static void main(String[] args) {
        String string = null;
        StringBuffer stringBuffer = new StringBuffer();

        int max = 10000;
        for(int i = 0; i < max; i++) {
            stringBuffer.append(i);
            if(i < max - 1) {
                stringBuffer.append(",");
            }
        }
        string = stringBuffer.toString();

        long start = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++) {
            string.split(",");
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);

        start = System.currentTimeMillis();
        StringTokenizer stringTokenizer =
                new StringTokenizer(string, ",");
        for(int i = 0; i < 10000; i++) {
            while(stringTokenizer.hasMoreTokens()) {
                stringTokenizer.nextToken();
            }
            stringTokenizer = new StringTokenizer(string, ",");
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
    }

}

大家看上面的代码,用StringTokenizer可以通过hasMoreTokens()方法判断是否有切割出的下一个元素,如果有就用nextToken()拿到这个切割出来的元素,一次全部切割完毕后,就重新创建一个新的StringTokenizer对象。

这样连续切割1w次,经过测试之后,会发现用StringTokenizer切割字符串1w次的耗时大概是1900毫秒左右。

大家感觉如何?是不是看到差距了?换一下切割字符串的方式,就可以让耗时减少400~500ms,性能目前已经可以提升20%了。

 

手把手带你实现一个更高效的字符串切割工具类

接着我们来自己封装一个切割字符串的函数,用这个函数再来做一次字符串切割看看,大家先看字符串切割函数的代码:

private static void split(String string) {
  String remainString = string;
  int startIndex = 0;
  int endIndex = 0;
  while(true) {
    endIndex = remainString.indexOf(",", startIndex);
    if(endIndex <= 0) {
      break;
    }
    remainString.substring(startIndex, endIndex);
    startIndex = endIndex + 1;
  }
}

上面那段代码是我们自定义的字符串切割函数,大概意思是说,每一次切割都走一个while循环,startIndex初始值是0,然后每一次循环都找到从startIndex开始的下一个逗号的index,就是endIndex,基于startIndex和endIndex截取一个字符串出来,然后startIndex可以推进到本次endIndex + 1即可,下一次循环就会截取下一个逗号之前的子字符串了。

下面我们用用上述自定义的切割函数再次测试一下,如下代码:

import java.util.StringTokenizer;

public class StringSplitTest {

    public static void main(String[] args) {
        String string = null;
        StringBuffer stringBuffer = new StringBuffer();

        int max = 10000;
        for(int i = 0; i < max; i++) {
            stringBuffer.append(i);
            if(i < max - 1) {
                stringBuffer.append(",");
            }
        }
        string = stringBuffer.toString();

        long start = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++) {
            string.split(",");
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);

        start = System.currentTimeMillis();
        StringTokenizer stringTokenizer =
                new StringTokenizer(string, ",");
        for(int i = 0; i < 10000; i++) {
            while(stringTokenizer.hasMoreTokens()) {
                stringTokenizer.nextToken();
            }
            stringTokenizer = new StringTokenizer(string, ",");
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);

        start = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++) {
            split(string);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
    }

    private static void split(String string) {
        String remainString = string;
        int startIndex = 0;
        int endIndex = 0;
        while(true) {
            endIndex = remainString.indexOf(",", startIndex);
            if(endIndex <= 0) {
                break;
            }
            remainString.substring(startIndex, endIndex);
            startIndex = endIndex + 1;
        }
    }

}

总结

经过上述代码测试之后,我们自己写的字符串切割函数的耗时大概是在1000ms左右,相比较之下,比String.split方法的性能提升了2倍多,比StringTokenizer的性能也提升了2倍,如果要是字符串更大呢?其实字符串越大,性能差距就会越多,可能会呈更大的倍数提升我们的性能!



Tags:Java代码   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20  Search: Java代码  点击:(25)  评论:(0)  加入收藏
五个提高Java代码安全性的VS Code插件
开发高质量的软件应用程序是一项艰巨的任务,因为它要求将多个组件整合在一起,创造出一个可工作的解决方案。因此,开发人员需要获取尽可能多的帮助和便利,特别是在确保应用程序安...【详细内容】
2023-11-11  Search: Java代码  点击:(230)  评论:(0)  加入收藏
掌握这五种多线程方法,提高Java代码效率
如果您的应用程序与那些能够同时处理多个任务的应用程序相比表现不佳,很可能是因为它是单线程的。解决这个问题的方法之一是采用多线程技术。以下是一些可以考虑的方法: 线程(T...【详细内容】
2023-10-17  Search: Java代码  点击:(306)  评论:(0)  加入收藏
通过这个技术,浏览器可以运行Node.js、Rust、Python、PHP、C++、Java代码了!
近日,WebContainers 发布重要更新,WASI(WebAssembly 系统接口)已全面集成到 WebContainers 中。这是一个重要里程碑,它扩大了可以使用浏览器执行的操作,是 Web 开发的全新范例,允许...【详细内容】
2023-10-13  Search: Java代码  点击:(276)  评论:(0)  加入收藏
优化Java代码效率和算法设计,提升性能
在Java开发中,代码效率低下和算法不合理可能导致程序性能下降。下面将从以下几个方面探讨如何优化Java代码和算法设计,以提高程序的性能:1、选择合适的数据结构和算法;2、减少循...【详细内容】
2023-09-19  Search: Java代码  点击:(281)  评论:(0)  加入收藏
教你将Java代码转换为Kotlin
在2017年的Google I/O大会上,Google 宣布 Kotlin 成为 Android 官方开发语言。Kotlin 是一种强大而多功能的语言,适用于各种开发任务。而且,Kotlin与Java是互操作的,可以轻松地...【详细内容】
2023-07-19  Search: Java代码  点击:(133)  评论:(0)  加入收藏
手把手教你将Java代码转换为Kotlin
在2017年的Google I/O大会上,Google 宣布 Kotlin 成为 Android 官方开发语言。Kotlin 是一种强大而多功能的语言,适用于各种开发任务。而且,Kotlin与Java是互操作的,可以轻松地...【详细内容】
2023-07-19  Search: Java代码  点击:(162)  评论:(0)  加入收藏
如何让ChatGPT充当细致入微的Java代码优化工?
注:本文使用New Bing(GPT4.0)演示1、让他扮演一个Java软件开发者第一步:我们让ChatGPT扮演一个Java软件开发者的角色 提示词插件:地址:ChatGPT BingChat GPT3 Prompt Generator Ap...【详细内容】
2023-04-04  Search: Java代码  点击:(224)  评论:(0)  加入收藏
Java代码是如何被CPU狂飙起来的?
在介绍Java如何一步步被执行起来之前,我们需要先弄明白为什么Java可以实现跨平台运行,因为搞清楚了这个问题之后,对于我们理解Java程序如何被CPU执行起来非常有帮助。无论是刚...【详细内容】
2023-03-05  Search: Java代码  点击:(363)  评论:(0)  加入收藏
改善Java代码的八个建议
前言Java是一门优秀的面向对象的编程语言,针对遇到同样的一个问题会有很多中解法,但是哪种实现方法是最优的或近似最优的,就需要不断的探究JDK的底层原理。本文针对提出了一些...【详细内容】
2022-07-25  Search: Java代码  点击:(341)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(18)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(25)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(30)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(61)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(77)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(78)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(97)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(111)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(105)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(82)  评论:(0)  加入收藏
站内最新
站内热门
站内头条