Java性能调优代码篇String内存优化
作者浩说编程
来源公众号:浩说编程
〔大厂技术资源研发必备安装包限时免费获取〕
String在日常开发中的使用频率应该不需要我过多形容,大家闭着眼睛都能手写出来,但也正因如此,对于String的性能优化最容易被忽视却也最为必要!
如何优化String的内存开支?
怎样用更少的空间管理String?
让我们带着这几个问题开始本篇的探讨。一、String自身的优化设计思想String和StringBuffer有什么区别?
StringBuffer可变,String不可变。
String为什么不可变?
额
这是一段面试的真实案例,面试者直接被pass掉,这也反映了一个普遍的问题:知其然而不知其所以然,希望大家引以为鉴,下面就来探讨一下String为什么不可变?
先从一个例子开始:Stringstr1abc;Stringstr2abc;System。out。print(str1str2);true123
相信大家都知道答案,重点来拆解一下每一步的底层逻辑:
1、Stringstr1abc;
首先,在常量池中查询abc是否已存在:
发现不存在,于是将abc初始化到常量池中,str1引用该内容:
2、Stringstr2abc;
再次创建相同字符串abc,同样在常量池中查询abc是否已存在
判断已经存在,于是不再重复创建内容,使用相同的引用:
于是得出答案true。
那么试想一下,如果String可变的话,这种常量池存放字符串,内容相同则不再开辟空间而是指向同一引用的设计思想是否还可行?
是不是即便创建了相同的字符串也要重新分配内存,造成不必要的内存损耗。这就是String自身的优化设计思想。
码文不易
你的关注是浩说编程持续更新的动力
浩说编程会做的更好
二、Stirng。intern:从20G到百兆内存消耗
该优化方法分享自全球知名社交平台推特(Twitter)的一名工程师,使用这种方法成功帮助他将String的内存消耗从20G降到几百兆。
我们通过代码来看一下intern方法做了什么:StringanewString(abc)。intern();StringbnewString(abc)。intern();if(ab){System。out。print(ab);}12345
创建a变量时,调用newSting()会在堆内存中创建一个String对象,String对象中的char数组将会引用常量池中字符串。在调用intern方法之后,会去常量池中查找是否有等于该字符串对象的引用,有就返回引用。
创建b变量时,调用newSting()会在堆内存中创建一个String对象,String对象中的char数组将会引用常量池中字符串。在调用intern方法之后,会去常量池中查找是否有等于该字符串对象的引用,有就返回引用。
而在堆内存中的两个对象,由于没有引用指向它,将会被垃圾回收。所以a和b引用的是同一个对象。
三、纠正字符串拼接误区
按照正常的理解,由于String不可变,那么每次运算操作都应该产生了一个新的对象,事实真的如此吗?Stringstrabc;1
我将上面代码编译成的class文件通过反编译之后的结果:Stringstrabc;1
所以事实是:在拼接String常量的时候,编译器对代码进行了优化,将字符串合并了。
我们再试一下拼接变量的效果:Stringbb;Stringstrabc;12
编译之后:Stringbb;Stringstr(newStringBuilder())。append(a)。append(b)。append(c);12
虽然编译器对String进行了优化,不过还是建议显示的使用StringBuffer或StringBuilder。
四、字符串分割的最优解
对于字符串的分割,我在上一篇讲到过split()方法中正则表达式的回溯引起的效率问题,所以建议采用indexOf()方法作字符串分割。
作者浩说编程
来源公众号:浩说编程
别饿坏了那匹马教学反思人教版六年级上册的《别饿坏了那匹马》一篇略读课文,课文主要写了酷爱读书的我在失去看书机会时,摆书摊的残疾青年谎称家中有马,买下马草,让我继续看书的事。下面是小编收集整理的别饿坏……
七年级英语下册期末复习提纲unit1where’syourpenpalfrom?一短语:1befromcomefrom来自于2livein居住在3onweekends在周末……
春日山中对雪有作阅读答案《春日山中对雪有作》出自于唐代诗人杜荀鹤的作品,透过这首诗可以品味出诗人内心的喜悦之情和对下层人民的关注和同情。以下是小编给你推荐的春日山中对雪有作阅读题及参考答案,希望对你有……
六年级音乐上册同一首歌教学设计导语:作为一名专为他人授业解惑的人民教师,往往需要进行教学设计编写工作,教学设计是教育技术的组成部分,它的功能在于运用系统方法设计教学过程,使之成为一种具有操作性的程序。如何把……
小班音乐游戏小兔和狼教案活动目标:1。听辨小兔和狼两种不同的音乐形象,在愉快和紧张两种不同的游戏气氛中,体验随音乐游戏的快乐。2。在游戏过程中逐步发现躲藏的规则,形成初步的自我控制意识。……
语文经典考试歇后语歇后语由劳动人民在日常生活中创造,具有鲜明的民族特色和浓郁的生活气息,经典歇后语。和小编一起来看看下文关于语文经典考试歇后语,欢迎借鉴!1、蜈蚣吃萤火虫心里明白2、……
不骄不躁的近义词反义词同义词字词解析不骄不躁的近义词同义词反义词如下:近义词:戒骄戒躁、泰而不骄、不亢不卑同义词:谦虚谨慎、不卑不亢反义词:骄傲自满、自高自大、操之过急不骄不躁在汉语词典的……
低碳出行,我绿牌e2,上牌容易还不限号随着汽车保量有的增多,各个城市正在变得越来越拥堵,而解决城市拥有问题,办法之一就是限号。小编亲身体验过摇号的感觉,怎么说呢,就跟平时买彩票一样,时刻关注着,但每期的结果都没中。……
亚马逊宣布2022年回归计划由于有潜在的迹象表明,员工重回办公室办公会令人感到不安,亚马逊确认其员工2022年1月才能回办公室。电子商务巨头最初目定于今年9月7日重返办公室办公,对于那些在家办公的人来说,……
助听器能左右耳佩戴吗?助听器有几种类型的,如果是简单的模拟助听器,是不区分左右耳,两侧都是可以直接佩戴的。不过现在主流市场的助听器都是数字助听器,是要测试听损患者的听力损失,根据听力损失和听觉反映调……
可实现万物互联华为鸿蒙系统将率先应用于BEIJING汽车6月2日,华为发布了鸿蒙操作系统,该系统可实现多个设备之间形成万物互联。而汽车作为超级终端,也将搭载鸿蒙操作系统,BEIJING汽车的某款SUV将成为首款搭载该系统的燃油车型,……
项羽本纪阅读答案解析和原文翻译项梁至定陶,再破秦军,项羽等又斩李由,益轻秦,有骄色。宋义谏项梁日:战胜而将骄卒惰者败。今空少惰矣,秦兵日益,臣为君畏之。项梁弗听。宋义使于齐。道遇齐使者高陵君显,日:公将见武……