本文来源于:

https://blog.csdn.net/xlgen157387/article/details/51870322

1.String对象

String对象是java中重要的数据类型,在大部分情况下我们都会用到String对象。其实在Java语言中,其设计者也对String做了大量的优化工作,这些也是String对象的特点,它们就是:不变性,常量池优化和String类的final定义。

1.1 不变性

String对象的状态在其被创建之后就不在发生变化。为什么说这点也是Java设计者所做的优化,在java模式中,有一种模式叫不变模式,了解的童鞋也应该知道不变模式的作用:在一个对象被多线程共享,而且被频繁的访问时,可以省略同步和锁的时间,从而提高性能。而String的不变性,可泛化为不变模式。

1.2 常量池优化

常量池优化指的是什么呢?那就是当两个String对象拥有同一个值的时候,他们都只是引用了常量池中的同一个拷贝。所以当程序中某个字符串频繁出现时,这个优化技术就可以节省大幅度的内存空间了。例如:

String s1 = "123";String s2 = "123";String s3 = new String("123");System.out.println(s1==s2); //trueSystem.out.println(s1==s3); //falseSystem.out.println(s1==s3.intern()); //true

以上代码中,s1和s2引用的是相同的地址,故而第四行打印出的结果是true;而s3虽然只

与s1,s2相等,但是s3时通过new String(“123”)创建的,重新开辟了内存空间,因引用的

地址不同,所以第5行打印出false;intern方法返回的是String对象在常亮池中的引用,所以

最后一行打印出true。

1.3 final的定义

String类以final进行了修饰,在系统中就不可能有String的子类,这一点也是出于对系统安全性的考虑。

2、字符串操作中的常见优化方法

2.1 split()方法优化

通常情况下,split()方法带给我们很大的方便,但是其性能不是很好。建议结合使用

indexOf()和subString()方法进行自定义拆分,这样性能会有显著的提高。

2.2 String常亮的累加操作优化方法

示例代码:

String s = "";long sBeginTime = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {    s+="s";}long sEndTime = System.currentTimeMillis();System.out.println("s拼接100000遍s耗时: " + (sEndTime - sBeginTime) + "ms");StringBuffer s1 = new StringBuffer();long s1BeginTime = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {    s1.append("s");}long s1EndTime = System.currentTimeMillis();System.out.println("s1拼接100000遍s耗时: " + (s1EndTime - s1BeginTime) + "ms");StringBuilder s2 = new StringBuilder();long s2BeginTime = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {    s2.append("s");}long s2EndTime = System.currentTimeMillis();System.out.println("s2拼接100000遍s耗时: " + (s2EndTime - s2BeginTime) + "ms");

结果:

上例所示,使用+号拼接字符串,其效率明显较低,而使用StringBuffer和StringBuilder的

append()方法进行拼接,效率是使用+号拼接方式的百倍甚至千倍,而StringBuffer的效率

比StringBuilder低些,这是由于StringBuffer实现了线程安全,效率较低也是不可避免的。

所以在字符串的累加操作中,建议结合线程问题选择,应避免使用+号拼接字符串。

2.3 StringBuffer和StringBuilder的选择

上例中也使用过StringBuffer和StringBuilder了,两者只有线程安全方面的差别,所以呢,在无需考虑线程安全的情况下,建议使用性能相对较高的StringBuilder类,若系统要求线程安全,就选择StringBuffer类。

2.4 基本数据类型转化为String类型的优化方案

示例代码:

Integer num = 0;int loop = 100000; // 将结果放大100000倍,以便于观察结果long beginTime = System.currentTimeMillis();for (int i = 0; i < loop; i++) {    String s = num+"";}long endTime = System.currentTimeMillis();System.out.println("+\"\"的方式耗时: " + (endTime - beginTime) + "ms");beginTime = System.currentTimeMillis();for (int i = 0; i < loop; i++) {    String s = String.valueOf(num);}endTime = System.currentTimeMillis();System.out.println("String.valueOf()的方式耗时: " + (endTime - beginTime) + "ms");beginTime = System.currentTimeMillis();for (int i = 0; i < loop; i++) {    String s = num.toString();}endTime = System.currentTimeMillis();System.out.println("toString()的方式耗时: " + (endTime - beginTime) + "ms");

以上示例中,String.valueOf()直接调用了底层的Integer.toString()方法,不过其中会先判空;+”“由StringBuilder实现,先调用了append()方法,然后调用了toString()方法获取字符串;num.toString()直接调用了Integer.toString()方法,所以效率是:num.toString()方法最快,其次是String.valueOf(num),最后是num+”“的方式。以下是结果截图:

建议童鞋们避免使用+”“的方式转换,最好是使用基本数据类型自带的toString()方法转换。就先分享到这儿吧!!!

java如何定义一个字符栈_Java性能优化之字符串优化处理相关推荐

  1. c++ 定义一个字符栈类Stack(包括类的实现)。数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。栈数组的尺寸由常量SIZE确定。栈的基本操作为Push()和Pop()。

    定义一个字符栈类Stack(包括类的实现).数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos.栈数组的尺寸由常量SIZE确定.栈的基本操作为Push()和Pop(). //定义一个字符栈 ...

  2. java语言定义一个具备栈功能的类_Java学习笔记 第二章 Java语言基础

    第二章 JAVA语言基础 一.关键字 1.关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有的字母都为小写 2.用于定义数据类型的关键字 c;ass  interface ...

  3. java中判断一个字符在字符串中出现的次数

    源代码: //java中判断一个字符出现的次数//在下面字符串中查找有几个啊public static void testFindChar(){String str = "啊!我爱你中国!啊 ...

  4. 2022-11-30:小红拿到了一个仅由r、e、d组成的字符串 她定义一个字符e为“好e“ : 当且仅当这个e字符和r、d相邻 例如“reeder“只有一个“好e“,前两个e都不是“好e“,只有第三个

    2022-11-30:小红拿到了一个仅由r.e.d组成的字符串 她定义一个字符e为"好e" : 当且仅当这个e字符和r.d相邻 例如"reeder"只有一个&q ...

  5. java 整型数组定义_在Java中定义一个具有10个元素的整型数组a的语句是:___

    在Java中定义一个具有10个元素的整型数组a的语句是:___ 答: int [] arr = new int[10] 在借贷记账法下() 答:在账户结构上,"借"和"贷 ...

  6. 用Java语言定义一个整数定义的数组,求奇数个数和偶数个数。

    ##[Java] 定义一个整数定义的数组,求奇数个数和偶数个数. /*作者:龙蝶 *日期:2020年4月4日 */public clsss Array{public static void main( ...

  7. Java编程定义一个数组,输出数组中的最大值与最小值

    package com.pzhu.demo;public class MaxMin {//Java编程定义一个数组,输出数组中的最大值和最小值public static void main(Strin ...

  8. 39.在Java中定义一个不做事且没有参数的构造方法的作用?

    1 在Java中定义一个不做事且没有参数的构造方法的作用 Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会 调用父类中"没有参数的构造方法&quo ...

  9. python如何把数字转化成字符_python 定义一个dictpython如何将数字转化为字符串

    python如何将数字转化为字符串?下面给大家介绍一下基本步骤: 第一步:在菜单栏里输入idle,打开shell; 第二步:新建文件并命名: 相关推荐:<python视频教程> W WW. ...

最新文章

  1. 视觉系统的演化之旅——视觉器官、光感受器及视觉分子
  2. happens-before规则和指令重排
  3. Oracle日期函数集锦
  4. 【Android游戏开发十七】让玩家自定义手势玩转Android游戏!—Android Gesture之【输入法手势技术】...
  5. mybatis核心配置_MyBatis 核心配置综述之StatementHandler
  6. diff算法_Virtual Dom和Diff算法
  7. devc跟vc2010通用吗_王者荣耀:通用铭文大全!让你赢在起跑线上!教你1比1换铭文...
  8. ZJOI2019 线段树
  9. .net 创建计划任务开机后自动以管理员身份启动运行 win7 ~ win10
  10. 信号与系统【奥本海目】第二版笔记
  11. 移动Web UI库(H5框架)有哪些,看这里就够了
  12. 嵌入式arm(一)学ARM要掌握的预备知识(本篇文章持续更新)
  13. Linux中reboot和shutdown的异同
  14. 小虎电商浏览器:多多打单电子面单怎么开通
  15. 从联想昭阳到MacBook Pro,致我的那些败家玩意—
  16. 【完美解决】修复concrt140.dll未找到错误的问题
  17. 5.Flink对接Kafka入门
  18. NET Framework合集(官方)
  19. 谁能限制拼多多?可能是直播
  20. 常见的汽车定位器问题与解决方法

热门文章

  1. windows下mysql安装失败的一个解决案例
  2. 欧拉定理扩展欧拉定理(证明)
  3. Linux内存描述之概述--Linux内存管理(一)
  4. 四、Java多人博客系统-2.0版本
  5. Eclipse的JQuery提示插件-Spket(别试了,没什么效果,且安装设置麻烦)
  6. hadoop 集群配置
  7. 利用jquery的imgAreaSelect插件实现图片裁剪示例
  8. 如何让本机时间与局域网的一台电脑的日期同步?
  9. 山寨SaaS--管理软件夜未眠(五)
  10. UA MATH565C 随机微分方程V 无穷小生成算子