一、字符串性能优化不容小觑,百M内存轻松存储几十G数据

一.String 对象是如何实现的?

String str1= "abc";
String str2= new String("abc");
String str3= str2.intern();
assertSame(str1==str2);
assertSame(str2==str3);
assertSame(str1==str3)
1、String str1 = "abc";通过字面量的方式创建,abc存储于字符串常量池中;
2、String str2 = new String("abc");通过new对象的方式创建字符串对象,引用地址存放在堆内存中,abc则存放在字符串常量池中;所以str1 == str2?显然是false
3、String str3 = str2.intern();由于str2调用了intern()方法,会返回常量池中的数据,地址直接指向常量池,所以str1 == str3;而str2和str3地址值不等所以也是false(str2指向堆空间,str3直接指向字符串常量池)。

二.String 对象的不可变性

代码中 String 类被 final 关键字修饰,变量 char 数组也被 final 修饰。
被final 修饰代表该类不可继承,而 char[]被 final+private 修饰,代表了 String 对象不可被更改。Java 实现的这个特性叫作 String 对象的不可变性,即 String 对象一旦创建成功,就不能再对它进行改变。

1、不可被更改的优点

第一,保证 String 对象的安全性。假设 String 对象是可变的,那么 String 对象将可能被恶意修改。
第二,保证 hash 属性值不会频繁变更,确保了唯一性,使得类似 HashMap 容器才能实现相应的 key-value 缓存功能。
第三,可以实现字符串常量池。在 Java 中,通常有两种创建字符串对象的方式,一种是通过字符串常量的方式创建,如 String str=“abc”;另一种是字符串变量通过 new 形式的创建,如 String str = new String(“abc”)。
代码中使用第一种方式创建字符串对象时,JVM 首先会检查该对象是否在字符串常量池中,如果在,就返回该对象引用,否则新的字符串将在常量池中被创建。这种方式可以减少同一个值的字符串对象的重复创建,节约内存。String str = new String(“abc”) 这种方式,首先在编译类文件时,"abc"常量字符串将会放入到常量结构中,在类加载时,“abc"将会在常量池中创建;其次,在调用 new 时,JVM 命令将会调用 String 的构造函数,同时引用常量池中的"abc” 字符串,在堆内存中创建一个 String 对象;最后,str 将引用 String 对象。

三.String 对象的优化

1、如何构建超大字符串?

尽量的使用StringBuilder或者StringBuffer
用String进行拼接的,即使已经被编译器优化成了StringBuilder,但是每次循环都会生成一个新的 StringBuilder 实例,同样也会降低系统的性能。

如果在多线程编程中,String 对象的拼接涉及到线程安全,你可以使用 StringBuffer。但是要注意,由于 StringBuffer 是线程安全的,涉及到锁竞争,所以从性能上来说,要比 StringBuilder 差一些。

2、使用 String.intern 节省内存

String.intern是一个Native方法,主要作用是将一个对象放入常量池(方法区、元空间)

在每次赋值的时候使用 String 的 intern 方法,如果常量池中有相同值,就会重复使用该对象,返回对象引用,这样一开始的对象就可以被回收掉。这种方式可以使重复性非常高的地址信息存储大小从 20G 降到几百兆。

下面是一些案例

String a =new String("abc").intern();
String b = new String("abc").intern();if(a==b) {System.out.print("a==b");
}
a和b虽然都把abc放入了常量池(方法区、元空间),但是a和b都指向的是堆中的对象,所以返回false。
String s3 = new String("1") + new String("1") ;s3.intern();String s4 = "11";System.out.println(s3 == s4);s3虽然是“11”,但是并不是堆区中的对象,因为是两个new出来的拼接而成的。s3.intern()是将“11”放入了常量池因为常量池中存在“11”,所以s3==s5=true。
String str2 = new String("str") + new String("01");
String str1 = "str01";
String str3 = str2.intern();
System.out.println(str3 == str1);常量池中有了str1的对象,所以  str2.intern()放入的步骤是无效的,赋值的步骤是有效的,都取自常量池,返回ture。
String str2 = new String("str") + new String("01");
str2.intern();
String str1 = "str01";
System.out.println(str2 == str1);str2和str1都取自常量池,因为str2是堆对象拼接而成的不是真正的堆对象,返回ture。String str3 = new String("str01");
str3.intern();
String str4 = "str01";
System.out.println(str3 == str4);
返回false

3、如何使用字符串的分割方法(尽量使用index替代Split())

Split() 方法使用了正则表达式实现了其强大的分割功能,而正则表达式的性能是非常不稳定的,使用不恰当会引起回溯问题,很可能导致 CPU 居高不下。
所以应该慎重使用 Split() 方法,可以用 String.indexOf() 方法代替 Split() 方法完成字符串的分割。如果实在无法满足需求,在使用 Split() 方法时,对回溯问题加以重视就可以了。

Java编程性能调优-01|字符串性能优化不容小觑,百M内存轻松存储几十G数据相关推荐

  1. MySql查询优化性能调优,sql性能自测方法,及Mysql索引介绍

    MySql查询优化性能调优,sql性能自测方法,及Mysql索引介绍 前言 一.普通优化加索引(适用于where条件后一个查询条件) 二.组合查询加索引(适用于where条件后多个查询条件) 三.My ...

  2. 《Java性能调优实战》笔记(一)Java编程性能调优、多线程性能优化

    文章目录 一.Java性能调优概述 1.1 性能调优标准 1.2 制定性能调优策略 二.Java编程性能调优 2.1 字符串 2.2 正则表达式 2.3 ArrayList和LinkedList的选择 ...

  3. hive性能调优实战pdf_Nginx 性能调优实战

    来自:Linux社区 1.Nginx运行工作进程数量 Nginx运行工作进程个数一般设置CPU的核心或者核心数x2.如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpui ...

  4. oracle性能调优书,Oracle性能调优领域的百科全书

    如果你想学习一种先进的系统化的Oracle性能调优方法,想找到一本包含设计.SQL优化.争用.内存与IO的完整的性能指南,想既关注基础知识也关注高级技巧,且其内容涵盖Oracle 10g.11g以及1 ...

  5. java jvm性能调优_java jvm性能优化

    摘要: 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bit 还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般 ...

  6. java商城项目性能调优_javaWEB项目性能调优

    在工作中难免要维护其他人做的项目.现在遇到一个情况,客户那里有 一台服务器  200G左右的硬盘,windows server 2003 32位操作系统,同时上面安装有sqlserver 2000数据 ...

  7. jvm性能调优 - 01类加载机制Review

    文章目录 困惑 代码是如何运行起来的(粗流程) 编译 类装载子系统 字节码执行引擎 类装载子系统 JVM在什么情况下会加载一个类 验证.准备和初始化的过程 验证阶段 准备阶段 解析阶段 核心阶段:初始 ...

  8. Android性能调优:App启动速度优化

    一.App启动分类 1.冷启动 Cold start 在启动应用前,系统还没有App的任何进程.比如设备开机后应用的第一次启动,系统杀掉应用进程 (如:系统内存吃紧引发的 kill 和 用户主动产生的 ...

  9. jvm性能调优实战 - 42JVM性能优化思路Review

    文章目录 新系统开发完毕之后如何设置JVM参数? 在压测之后合理调整JVM参数 线上系统的监控和优化 线上频繁Full GC的几种表现 频繁Full GC的几种常见原因 一个统一的JVM参数模板 新系 ...

最新文章

  1. jq:jQuery库文件jquery.scrollLoading.js使用方法
  2. textrank4zh是_GitHub - renxiaowei941015/TextRank4ZH: 从中文文本中自动提取关键词和摘要...
  3. Hi3516A开发--RTC电路
  4. 循环自相关函数和谱相关密度(五)——实信号、复信号模型下的QPSK信号循环谱MATLAB仿真结果及代码
  5. java 仿qq登录界面7.1_安卓开发学习笔记(七):仿写腾讯QQ登录注册界面
  6. java 空包_圆通快递接口,圆通快递礼品商城接口、圆通空包接口,圆通快递低价接口,礼品商城接口、一件代发接口...
  7. 有趣的算法(五):一文读懂二叉搜索树的插入、删除
  8. python字符类型
  9. mq消息落地及业务处理踩坑记录
  10. linux shell let命令,linux shell let, expr 命令详解
  11. python 日志框架_按日期打印Python的Tornado框架中的日志的方法
  12. 手机mstsc远程工具_手机远程连接服务器工具:RD client远程桌面使用教程
  13. 房间类游戏中的房间ID管理
  14. python中pow_Python中float的内置pow()和math.pow()之间的区别?
  15. photoshop 裁剪_如何在Photoshop中裁剪图像
  16. 信用风险计量模型汇总
  17. [APIO2016]烟火表演
  18. AD封装与原件的一一对应(+封装管理器的使用)
  19. JWT的初步了解以及session、cookie机制
  20. 做不好这一点,企业微信运营可能要全“白搭”!【企业微信增长神器Vol.1】

热门文章

  1. 洛咕 P3645 [APIO2015]雅加达的摩天楼
  2. 【NLP】简单神经网络
  3. (转)SpringBoot 打包为war包启动时导入外部配置文件
  4. 【Paper】2021_多智能体系统编队跟踪控制_张晓广
  5. python3.8.2下载失败_Python3.8.2下载
  6. 使用牛顿迭代法求根(C)
  7. 2023智慧养老展,北京老年智能产品及智慧养老管理系统展览会
  8. Unity3d学习 第一天 使用Unity3d的物理引擎制作 小球打砖块 游戏
  9. redis笔记-对象的空转时长
  10. Andrid中的plurals