Java性能优化之String字符串优化,BAT 面试官 如何面试

Java String 优化使用 String性能提升10倍的几个方法 String 类型是我们使用最频繁的数据类型,没有之一。那么提高 String 的运行效率,无疑是提升程序性能的最佳手段。 我们本文将从 String 的源码入手,一步步带你实现字符串优化的小目标。不但教你如何有效的使用字符串,还为你揭晓这背后的深层次原因。 本文涉及的知识点,如下图所示: 在看如何优化 String 之前,我们先来了解一下 String 的... 阅读详情


写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫码加微信好友进【程序员面试学习交流群】,免费领取。也欢迎各位一起在群里探讨技术。

 

 

字符串是软件开发中最重要的对象之一。通常,字符串对象在内存中是占据了最大的空间块,因此如何高效地处理字符串,必将是提高整体性能的关键所在。


 

 

1.字符串对象及其特点

Java中八大基本数据类型没有String类型,因为String类型是Java对char数组的进一步封装。

String类的实现主要由三部分组成:char数组,offset偏移量,String的长度。

String类型有三个基本特点:




  1.  
  2. 不变性

     

    不变性是指String对象一旦生成,则不能再对它进行改变。

     

    不变性的作用在于当一个对象需要被多线程共享,并且频繁访问时,可以省略同步和锁等待的时间,从而大幅提高系统性能。




     
  3. 针对常量池的优化

     

    当两个String对象拥有相同的值时,它们只引用常量池中的同一个拷贝。




     
  4. 类的final定义

     

    作为final类的String对象在系统中不能有任何子类,这是对系统安全性的保护!




     

1.1 subString()方法的内存泄漏

关于这一点,在JDK的1.7及以后就已经解决了!

在1.7之前,subString()方法截取字符串只是移动了偏移量,截取之后的字符串实际上还是原来的大小。

现在,当使用subString()方法截取字符串时会把截取后的字符串拷贝到新对象。

1.2 字符串分割与查找

1、原始的String.split()

String.split()方法使用简单,功能强大,支持正则表达式,但是,在性能敏感的系统中频繁的使用这个方法是不可取的。

 

注意 * ^ : | . 这些符号记得\转义


 

2、使用效率更高的StringTokenizer类分割字符串

StringTokenizer类是JDK中提供的专门用来处理字符串分割的工具类。构造方法:

public StringTokenizer(String str, String delim, boolean returnDelims) 

其中str是要分割的字符串,delim是分割符,returnDelims是否返回分隔符,默认false。

  String s = "a;b;c";

  StringTokenizer stringTokenizer = new StringTokenizer(s, ";", false);

  System.out.println(stringTokenizer.countTokens());

  while (stringTokenizer.hasMoreTokens()) {

      System.out.println(stringTokenizer.nextToken());

  }

3、最优化的字符串分割方式

indexOf()方法是一个执行速度非常快的方法,subString()是采用了时间换空间技术,因此速度相对快。

    public static List<String> mySplit(String str, String delim){

        List<String> stringList = new ArrayList<>();

        while(true) {

            int k = str.indexOf(delim);

            if (k < 0){

                stringList.add(str);

                break;

            }

            String s = str.substring(0, k);

            stringList.add(s);

            str = str.substring(k+1);

        }

        return stringList;

    }

4、三种分割方法的对比与选择

split()方法功能强大,但是效率最差;

StringTokenizer性能优于split方法,能用StringTokenizer就没必要用split();

自己实现的分割算法性能最好,但代码的可读性和系统的可维护性最差,只有当系统性能成为主要矛盾时,才推荐使用该方法。

5、高效率的charAt方法

charAt(int index) 返回指定索引处的 char 值。功能和indexOf()相反,效率却一样高。

6、字符串前后辍判断

public boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始

public boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束

这两个Java内置函数效率远远低于charAt()方法。单元测试:

    @Test

    public void test(){

        String str = "hello";

        if (str.charAt(0)=='h'&&str.charAt(1)=='e'){

            System.out.println(true);

        }

        if (str.startsWith("he")){

            System.out.println(true);

        }

    }

1.3 StringBuffer和StringBuilder

1、String常量的累加操作

String s = "123"+"456"+"789";

虽然从理论上说字符串的累加的效率并不高,但该语句执行耗时为0;反编译代码后,我们发现代码是

String s = "123456789";

显然,是Java在编译时做了充分的优化。因此,并没有想象中那样生成大量的String实例。

 

对于静态字符串的连接操作,Java在编译时会进行彻底的优化,将多个连接操作的字符串在编译时合成一个单独的长字符串。


 

2、String变量累加的操作

  String str = "hello";

  str+="word";

  str+="!!!";

我们利用“+=”改变字符串内容的值,实际上字符串根本没有改变。

当 str+="word" 时,堆内存开辟了word的内存空间和helloword的两个内存空间(相当于实例化了两个String对象),并把str的引用指向了helloword,原来的hello和word成为了垃圾被JVM回收。

3、concat() 连接字符串

String的concat()是专门用于字符串连接操作的方法,效率远远高于“+”或者“+=”。

4、StringBuffer和StringBuilder

不用多说了,就是为字符串连接而生的,效率最高。不同的是,StringBuffer几乎对所有的方法都做了同步,StringBuilder并没有做任何同步,效率更高一些。只不过在多线程系统中,StringBuilder无法保证线程安全,不能使用。

5、容量参数

StringBuffer和StringBuilder的是对String的封装,String是对char数组的封装。是数组就有大小,就有不够用的时候,不够用只能扩容,也就是把原来的再复制到新的数组中。合适的容量参数自然能够减少扩容的次数,达到提高效率的目的。

在初始化时,容量参数默认是16个字节。在构造方法中指定容量参数:

public StringBuilder(int capacity) 

1.4 附一些实用的方法

判断字符串相等(忽略大小写)

equalsIgnoreCase(String anotherString)

判断是否存在子字符串(返回布尔类型)

contains(CharSequence s)

将指定字符串连接到此字符串的结尾

concat(String str)

使用指定的格式字符串和参数返回一个格式化字符串

format(String format, Object... args)

使用默认语言环境的规则将此 String 中的所有字符都转换为小写。

toLowerCase() 

使用默认语言环境的规则将此 String 中的所有字符都转换为大写。

toUpperCase() 

返回字符串的副本,忽略前导空白和尾部空白。

trim() 

使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

String replaceAll(String regex, String replacement)

按字典顺序比较两个字符串,不考虑大小写。

int compareToIgnoreCase(String str)



  •  
  • 如果参数字符串等于此字符串,则返回值 0;


     
  • 如果此字符串小于字符串参数,则返回一个小于 0 的值;


     
  • 如果此字符串大于字符串参数,则返回一个大于 0 的值。


     
 

本文参考《Java程序性能优化》葛一鸣著


 

 


转载:https://www.cnblogs.com/yueshutong/p/9520691.html

推荐内容:
java常见面试题及答案
java多线程面试题整理及答案(2018年)
【java面试宝典】一年工作经验者适用
Java方向如何准备BAT技术面试答案(汇总版)
2018年Java面试题整理
Java面试题—中级(中)
JAVA SSM框架基础面试题
Java面试经
java常见面试题总结
Java基础面试题(1)

 

JavaWeb学籍管理系统毕业设计:从MVC架构到数据库设计的实战指南 管理信息系统(MIS)是信息化时代处理结构化业务数据的核心软件形态,其原理在于通过数据库系统对业务实体与流程进行建模,实现数据的持久化存储与高效检索。在Java技术栈中,Spring MVC框架遵循模型-视图-控制器的设计模式,通过分层架构将业务逻辑、数据访问和展示分离,极大地提升了代码的可维护性和可扩展性。结合MyBatis作为持久层框架,开发者能够在灵活编写SQL的同时,便捷地完成对象关系映射,这对于处理学生、课程、成绩等多表关联查询至关重要。这类技术组合的工程价值在于,能够构建出稳定、可扩展的业务系统 阅读详情

相关推荐

【网络安全】Centos7安装杀毒软件----ClamAV

Clam AntiVirus是一个Linux系统上使用的反病毒软件包。主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库。

你在看屏幕的同时,屏幕也在注视着你 8828

java string 优化_String高效编程优化(Java)

1, substring截取超大字符串可能造成的“内存泄漏”2,+ 操作符的优化和局限3,StringBuilder和StringBuffer4,split和StringTokenizer做简单字符分割效率的比较1, substring截取超大字符串可能造成的“内存泄漏”我们知道,String对象内保存着一个char数组。但是char数组未必和String所代表的字符集等长,而可能是一个“超集”。...

weixin_42429893的博客 502

C#粘包和分包问题及解决方法

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:  下面对上面的图进行解释:  1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。  2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲...

weixin_42033401的博客 7767

Java性能优化之String字符串优化

字符串是软件开发中最重要的对象之一。通常,字符串对象在内存中是占据了最大的空间块,因此如何高效地处理字符串,必将是提高整体性能的关键所在。 1.字符串对象及其特点 Java中八大基本数据类型没有String类型,因为String类型是Java对char数组的进一步封装。 String类的实现主要由三部分组成:char数组,offset偏移量,Stri...

weixin_34261739的博客 689

第1关:STL模板之queue实例一:最少个数

头歌自创答案

xiyunSacire的博客 818

Meta开源Ego-Exo4D数据集:如何用1400小时多模态视频训练你的AI模型

Meta开源的Ego-Exo4D数据集包含1400小时多模态视频,涵盖第一人称和第三人称视角、眼动追踪、IMU传感器等多种模态,是AI模型训练的宝贵资源。本文详细介绍了从数据集下载、预处理到模型训练的全流程,帮助研究者高效利用这一多模态数据集进行AI模型开发。

weixin_29159441的博客 342

java contains 效率_java String contains逻辑的优化

有一个”AAA,BBB”格式的字符串组成的List,有一个字符串SSS现在想遍历List,如果字符串SSS中包含了AAA,并且包含了BBB,则返回ture。否则将List全部遍历,都不符合条件则返回false。目前的思路是在遍历List的时候,使用split分割为String数组:[“AAA”,”BBB”];然后使用contains判断字符串SSS中是否包含”AAA”,包含则继续判断SSS是否包含...

weixin_39827306的博客 1710

【硬件的单元测试 UT 3】PCIe 3.0及信号完整性测试方法

PCIe标准自从推出以来,1代和2代标准已经在PC和Server上逐渐普及,用于满足高速显卡、高速存储设备对于高速数据传输的要求。出于支持更高总线数据吞吐率的目的,PCI-SIG组织在2010年制定了PCIe 3.0,即PCIe 3代的规范,数据速率达到8Gbps。

qq_43416206的博客 1414

IntelliJ IDEA高效开发环境配置全攻略:从基础设置到性能调优

集成开发环境(IDE)是程序员的核心生产力工具,其配置优化直接影响开发效率与体验。IntelliJ IDEA作为业界主流的Java IDE,通过合理的全局与项目设置,能够实现代码提示、编译构建、版本控制等核心功能的深度定制。理解配置的层次结构(全局、项目、默认值)是有效管理开发环境的基础,正确的JDK、Maven路径与编码设置能从根本上避免环境依赖问题。在工程实践中,针对高频操作自定义快捷键、精选必备插件(如Key Promoter X、String Manipulation),并活用Live Templa

dengjuanshou7445的博客 533

11.8 LangGraph生产级AI Agent开发:从节点定义到高并发架构的终极指南

本文介绍了如何使用 LangGraph 构建生产级 AI Agent,重点解析了 LangGraph 的核心设计、节点与边的实现方法论、生产级实现技巧以及性能优化策略。LangGraph 通过图结构抽象复杂 AI 工作流,核心组件包括节点、边、状态和检查点。节点通过 Python 函数封装原子业务逻辑,边通过条件分支实现动态工作流。生产级实现技巧包括状态管理、多会话控制和错误处理机制。性能优化策略涉及并行执行和缓存机制设计。文章还提供了旅行规划 Agent 的实战案例和常见问题解决方案,帮助开发者构建高效、

yonggeit的博客 3268

C#实现自己的远程桌面控制工具

1. 创建一个winform工程并添加RDP客户端COM组件。右击工具箱,然后点击选择项,选中下图所示组件并点击确定。为窗口加载时添加自动连接远程桌面代码。3.调试运行程序,验证远程桌面控制。拖放RDP控件到窗口中。2.编写远程桌面连接代码。

6089

BAT Android面试核心考点与实战解析

面向对象编程(OOP)中的方法重载与覆盖是Java基础的重要概念,重载实现编译时多态,覆盖实现运行时多态,这在Android开发中广泛应用。Handler机制作为Android线程通信的核心,通过Looper、MessageQueue、Handler和Message四个组件的协作实现跨线程消息处理。在性能优化方面,内存泄漏检测与预防是关键,常见场景包括静态引用、Handler持有和资源未释放等。架构设计上,从MVC到MVVM的演进解决了代码耦合问题,结合Jetpack组件实现模块化开发。这些技术点不仅是BA

weixin_33882452的博客 505

【ComfyUI】QwenImageEdit OOTD角色与姿态匹配换装

本文介绍了一个基于Qwen Edit OOTD 2.0的ComfyUI工作流,能够实现角色与姿态匹配的智能穿搭生成。该工作流通过整合模型推理、姿态识别、图像拼接和渲染等节点,完成从角色图、姿态图到成品穿搭图的完整生成流程。核心采用Qwen Image系列模型进行图像理解和编辑,配合ControlNet进行姿态引导。用户只需提供角色图和姿态参考图,系统即可自动完成姿态解析、语义编码、采样生成等步骤,输出与输入姿态一致的穿搭图像。该方案适用于虚拟角色展示、电商试穿等场景,能保持角色特征一致的同时灵活变换姿态,显

Mr数据杨 1584

String字符串性能优化的方案,讲的太清楚了

我朋友去年九月份换工作,简历投了很多大厂,美团、京东的offer都到手了。 阿里的面试进行到了第三轮,刚开始聊得还好,直到阿里面试官揪着MyBatis源码一直问,他自己MyBatis还是比较常用的,但是没深入看过源码,所以没回答好,结果可想而知了。 现在给大家分享一下阿里面试官问他的一些mybatis的部分题目: MyBatis 与 Hibernate 有哪些不同? Mybatis源码中用了哪些设计模式?为什么要用这些设计模式? MyBatis是如何为二级缓存动态添加日志、同步控制、阻塞、缓存淘汰策略等附

m0_57768082的博客 169

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

阿里面试官:字符串在JVM中如何存放?90%的人就真的只回答在哪里存放

点击上方石杉的架构笔记,右上角选择“设为星标”每日早8点半,技术文章准时送上公众号后台回复“学习”,获取作者独家秘制精品资料往期文章BAT 面试官是如何360°无死角考察...

石杉的架构笔记 320

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

字符串中间插一个字符_为什么要用内插字符串代替string.format?

推荐学习渣硕春招首站告捷,靠着数套的Java刷题PDF,成功“混进”腾讯T3面试官最爱问的Kakfa,基础+进阶+高级,44问疯狂轰炸!面试BAT 却被二叉树秒杀?20 道题帮你一举拿下二叉树算法题知道为什么要用内插字符串,只有踩过坑的人才能明白,如果你曾今使用string.format超5个以上占位符,那其中的痛苦我想你肯定是能够共鸣的。一:痛苦经历先上一段曾今写过的一段代码,大家来体会一下: ...

weixin_39986466的博客 511

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java大厂面试核心:从基础到分布式架构实战

Java技术面试正从基础理论考察转向工程实践能力验证,尤其关注JVM原理、分布式架构和业务场景解决方案。理解HashMap原理只是起点,如何设计百万QPS的秒杀系统才是大厂面试的关键。深入探讨JVM性能优化时,需要掌握G1回收算法和逃逸分析等核心技术;分布式场景下,需处理缓存击穿、时钟回拨等典型问题。通过分析电商、外卖等真实业务案例,揭示Java工程师在并发编程、Spring框架源码、MySQL索引优化等领域的高频考点。掌握这些技术不仅能通过面试,更能提升解决复杂业务问题的实战能力。

weixin_33488239的博客 312

BAT大厂Android面试核心考点与实战解析

Java虚拟机(JVM)内存模型和并发编程是Android开发的基础核心技术,理解这些原理能有效解决内存泄漏和线程安全问题。在Android系统中,Binder机制和Handler原理等系统级知识直接影响应用性能,结合性能优化工具如Android Profiler和LeakCanary可快速定位OOM问题。大厂面试特别注重将原理应用于实际场景,如通过组件化架构设计提升工程效率,或使用MVVM模式实现数据驱动UI。掌握这些技术不仅能应对BAT等大厂的深度考察,更能为构建高性能Android应用打下坚实基础。

weixin_34168880的博客 404

Java面试高频考点与核心特性解析

Java作为企业级开发的主流语言,其基础语法和核心特性是构建健壮应用的基石。从数据类型与运算符到面向对象特性,再到集合框架与多线程编程,这些基础概念构成了Java开发的核心知识体系。理解自动装箱拆箱机制、字符串处理三剑客的区别、HashMap底层实现原理等关键技术点,不仅能帮助开发者通过技术面试,更能提升代码质量与性能。在实际开发中,合理运用接口与抽象类、掌握异常处理原则、优化线程同步策略,都是提升工程实践能力的关键。本文聚焦Java开发中最常被考察的技术要点,结合大厂面试真题,系统梳理数据类型、面向对象、

weixin_34268579的博客 526

2026年Java面试核心攻略与趋势分析

Java作为企业级开发的主流语言,其技术生态持续演进,尤其在云原生和高并发场景中展现出强大的生命力。随着JDK17~21新特性的引入,如虚拟线程(Project Loom)和ZGC垃圾回收器,Java在性能优化和资源利用率上有了显著提升。分布式系统设计、容器化适配以及GraalVM原生镜像等技术的结合,进一步扩展了Java的应用场景。在金融、电商等高并发领域,Java的稳定性和成熟生态使其成为首选。本文通过解析大厂面试题,探讨Java面试的最新趋势,包括云原生架构、分布式事务处理以及性能调优等核心知识点,帮

weixin_30847939的博客 559

本以为的铁饭碗疫情期间我被裁了,失业两个月,五一节前拿到offer

故事的开始 没错在疫情期间,我被裁了!!!这是多么令人悲伤的故事,我就此放弃了吗?不可能,来看看我是如何做到完美逆袭。 朋友A:市场条件不好,找不到合适的工作 朋友B:工资太低了,还不如上一家工资 朋友C:现在都找不到工作,又不是我一个人,正好多休息一段时间 朋友D:哎呦,刚刚好陪陪老婆孩子,工作慢慢找不着急 以上是我身边的朋友说的最多的话,一转眼2020一半都过去了结果还在家里蹲,一边自我安...

Android725的博客 871

Java面试新趋势:从八股文到场景化深度考察的实战应对策略

在Java技术领域,面试考察正从传统的知识点背诵转向对技术原理深度理解和复杂场景解决能力的评估。理解技术原理是掌握Java并发编程、JVM性能调优、MySQL索引优化等核心概念的基础。这些原理知识能够帮助开发者在高并发、分布式系统等实际应用场景中,设计出高性能、高可用的解决方案,从而体现其技术价值。例如,深入理解JVM内存模型和垃圾回收机制,对于诊断线上OOM问题和进行系统调优至关重要;掌握MySQL的B+树索引原理和事务隔离级别,是设计千万级数据表架构和保证数据一致性的前提。当前,面试官更关注候选人能否将

weixin_34210740的博客 350

BAT实习笔试复盘:算法与系统设计高频考点解析

在技术面试与笔试中,算法与数据结构是不可或缺的核心能力。从动态规划到二分查找,从链表操作到二叉树遍历,这些基础原理不仅考察候选人的逻辑思维,更直接关系到高并发场景下的系统设计能力。在实际工程中,掌握这些知识能够帮助开发者高效解决性能优化、资源调度等真实问题。技术面试常以经典题型为切入点,评估应聘者的工程潜力。本文以BAT实习内推笔试试卷为案例,深入复盘算法、系统设计、语言基础等高频考点,提供实战解题思路与准备策略。

weixin_34007020的博客 404

Java高级面试与工程实践:JVM调优与分布式系统设计

JVM性能调优是Java工程师的核心能力之一,涉及内存管理、垃圾回收机制等底层原理。通过合理配置堆内存参数和使用G1GC等现代垃圾回收器,可以显著提升应用性能。在高并发场景下,设计模式如单例模式和生产者-消费者模式的应用至关重要,能够有效解决线程安全和资源竞争问题。分布式系统的一致性保障则需要借助分布式锁和事务方案,如Redis锁和最终一致性模型。这些技术不仅在大厂面试中频繁出现,也是实际工程中必须面对的挑战。本文结合OutOfMemoryError诊断和G1GC调优等实战案例,深入探讨Java高级开发中的

weixin_34043301的博客 339

字母异位词分组:哈希表与排序/计数法的核心原理与工程实践

哈希表是一种基于键值对映射的高效数据结构,其核心原理是通过哈希函数将任意输入转换为固定大小的键,从而实现平均O(1)时间复杂度的查找与插入。在解决字符串分组、去重、快速查找等问题时,哈希表因其卓越的性能而成为首选技术。字母异位词分组问题正是哈希表应用的经典场景,它要求将字符组成相同但顺序不同的字符串归为一组。解决此问题的关键在于设计一个合适的哈希表键,使得所有互为字母异位词的字符串都能映射到同一个值。两种主流技术路径由此展开:一是对字符串进行排序,将排序后的结果作为键;二是当字符集有限(如仅小写字母)时,使

weixin_34268169的博客 347

字母异位词分组:哈希表核心思想与两种高效解法详解

哈希表作为一种基础数据结构,其核心原理是通过键值对实现快速的数据存储与查找。在算法与数据处理领域,哈希表常用于解决分类、聚合和去重问题,其技术价值在于能够将时间复杂度从O(n²)优化至接近O(n)。一个典型的应用场景是字符串处理,例如对一组单词进行分组。字母异位词是指字母组成相同但顺序不同的单词,判断它们的关键在于设计一个统一的“键”。本文以力扣第49题为例,深入探讨了如何利用排序或字符计数的方法生成哈希表键,从而高效实现字母异位词分组,涵盖了从暴力解法到最优化的完整演进路径,并分析了在不同数据规模下的策略

weixin_30256901的博客 424
上一篇: Java体系学习书籍推荐,BAT 面试官 如何面试
下一篇: Java 中的几种线程池,你之前用对了吗,互联网 面试官 如何面试
agoodcoder777
博客等级 码龄8年 24粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值