Java SE API know how-字符串
创始人
2025-06-01 04:00:22

Java SE API know how

字符串

紧凑字符串

java8
无论字符串的编码,最终都会编码为16位字符数组。

java11
字符串会编码为8位字节数组,这些字符串被称为紧凑字符串(compact string)
一个普通的java字符串的大小约是java8相同字符串的一半。
3-10倍的性能提升对比。
-XX:+CompactString 默认开启
except instance
应用程序中所有字符串都需要16位编码,和非紧凑字符串相比,在紧凑字符串中对这些字符串操作会稍长时间

重复字符串和字符串保留

创建很多包含相同字符序列的对象,基于对象不可变占用额外空间。
要知道是否有大量重复对象需要进行堆分析
jcmd GC.class_histogram
jcmd Thread.print

字符串去重

让jvm找到重复字符串后去重(deduplicate)
只有使用G1 GC + -XX:UseStringDeduplication标志 默认false
pros and cons

  1. 需要在G1 GC的新生代回收和混合回收阶段进行额外处理,延长回收时间
  2. 需要一个额外线程与应用线程同时运行,占用应用程序线程CPU周期
  3. 如果重复字符串很少,可能达不到效果

java工程师估计预期受益10%

#jdk8

-XX:PrintStringDeduplicationStatistics

#jdk11 after

-Xlog:gc+stringdebup*=debug

[0.896s][debug][gc,stringdedup] Last Exec: 110.434ms, Idle: 729.700ms,
Blocked: 0/0.000ms
[0.896s][debug][gc,stringdedup] Inspected: 62420
[0.896s][debug][gc,stringdedup] Skipped: 0( 0.0%)
[0.896s][debug][gc,stringdedup] Hashed: 62420(100.0%)
[0.896s][debug][gc,stringdedup] Known: 0( 0.0%)
[0.896s][debug][gc,stringdedup] New: 62420(100.0%)
3291.7K
[0.896s][debug][gc,stringdedup] Deduplicated: 15604( 25.0%)
731.4K( 22.2%)
[0.896s][debug][gc,stringdedup] Young: 0( 0.0%)
0.0B( 0.0%)
[0.896s][debug][gc,stringdedup] Old: 15604(100.0%)
731.4K(100.0%)

晋升的字符串可以进行去重的时间点是通过

-XX:StringDeduplicationAgeThreshold=N标志 默认3

字符串保留

编程层面处理字符串重复的方法是使用原生方法intern()方法

保留字符串存在特殊的哈希表中——哈希表存储在原生内存中,字符串存储在堆中

-XX:StringTableSize=N设置

【固定大小的哈希表】

哈希表包含一个数组,该数组容纳一定数量的条目,数组中每个元素被称为一个桶

当某个对象被存储在哈希表中是,存储索引是通过hashCode % numberOfBuckets计算

这个方案可能让两个具有不同hashCode值的对象很可能被映射到同一个桶

每个桶实际上是映射到该桶的所有存储项的链表

当两个对象被映射到同一个桶,这种情况被称为碰撞(collision)

当哈希表有更多对象之后,碰撞就会更多,更多的项存储到每个链表中

查找某个项需要遍历链表搜索,如果链表很长则增加搜索市场

通过调整哈希表可以有更多桶(减少碰撞),通过动态调整哈希表的大小的设计java中的HashMap便是如此。

【字符串保留和相等比较】

String.intern()更快

保留字符串可以通过==比较,是一个更快的引用比较

保留字符串的成本:计算字符串的hash码,也就是扫描整个字符串,并对每个字符进行hash操作

String.equals比较方式

不等长不相同

等长进行比较找到未必配字符

自定义字符串保留

Your mileage may very

字符串连接

jdk8 and jdk11 and optimal


@Benchmarkpublic void testSingleStringBuilder(Blackhole bh) {String s = new StringBuilder(prefix).append(strings[0]).toString();bh.consume(s);
}
@Benchmark
public void testSingleJDK11Style(Blackhole bh) {String s = prefix + strings[0];bh.consume(s);
}
@Benchmark
public void testSingleJDK8Style(Blackhole bh) {String s = new StringBuilder().append(prefix).append(strings[0]).toString();bh.consume(s);
}

在这里插入图片描述

  1. 手动操作进行编码
  2. jdk11编译进行最新的编译器优化
  3. jdk8和11都是一样的编译方式

最终数据显示发现两种优化都比手动编码好,只是编译器没有发现特定的模式。

如果jdk8对字符串和其他类型进行链接则情况

@Benchmark
public void testDoubleJDK11Style(Blackhole bh) {double d = 1.0;String s = prefix + strings[0] + d;bh.consume(s);
}
@Benchmark
public void testDoubleJDK8Style(Blackhole bh) {double d = 1.0;String s = new StringBuilder().append(prefix).append(strings[0]).append(d).toString();bh.consume(s);
}

在这里插入图片描述

jdk8在处理非字符串链接类型时候对整形处理的较好,但是双精度情况下则会跳过优化,复原了手动编码的性能。

多次链接操作或者循环中执行链接操作的测试数据


@Benchmark
public void testJDK11Style(Blackhole bh) {String s = "";for (int i = 0; i < nStrings; i++) {s = s + strings[i];}bh.consume(s);
}
@Benchmark
public void testJDK8Style(Blackhole bh) {String s = "";for (int i = 0; i < nStrings; i++) {s = new StringBuilder().append(s).append(strings[i]).toString();}bh.consume(s);
}
@Benchmark
public void testStringBuilder(Blackhole bh) {StringBuilder sb = new StringBuilder();for (int i = 0; i < nStrings; i++) {sb.append(strings[i]);}bh.consume(sb.toString());
}

在这里插入图片描述

测试结果显示最好的性能是手动编码方式

当在多次拼接或者循环中链接字符串最好显式使用StringBuilder对象获取更好的性能

相关内容

热门资讯

元凌卿是什么小说,前世辜负了痴... 元凌卿是什么小说目录《醉玲珑》大结局是什么?前世辜负了痴情的七王爷,重生后她不再任性叫什么名字女主叫...
忘年之交指怎样的朋友,忘年之交... 忘年之交指怎样的朋友目录忘年之交指怎样的朋友忘年之交指的是什么样的朋友?
披头士为什么叫甲壳虫(披头士和... 今天给各位分享披头士为什么叫甲壳虫的知识,其中也会对披头士和甲壳虫的区别进行解释,如果能碰巧解决你现...
白灵结局是什么,活佛济公里的白... 白灵结局是什么目录白灵结局是什么活佛济公里的白灵是个什么结局?活佛济公4白灵的结局白灵结局是什么呢?...
择天记电视剧结局,择天记结局 ... 择天记电视剧结局目录择天记电视剧结局择天记结局 大结局请查收电视剧《择天记》大结局是什么?落落结局为...
三星手机怎么录制屏幕视频,三星... 2. 在通知面板中,找到并点击
保险的基本知识有哪些,关于买保... 保险的基本知识有哪些目录保险的基本知识有哪些关于买保险的基本知识买保险,需要知道的基本知识保险的基础...
每次消防出警需要收费的吗,消防... 每次消防出警需要收费的吗目录每次消防出警需要收费的吗消防队出警灭火,需要交钱么?消防员出警要收费吗消...
14K金项链会掉色吗,k14项... 14K金项链会掉色吗目录14K金项链会掉色吗k14项链掉色正常吗?14K金子掉色吗?14k金会掉色吗...
如何正确的使用加湿器,加湿器怎... 如何正确的使用加湿器目录如何正确的使用加湿器加湿器怎么使用正确加湿器使用注意事项加湿器的正确使用方法...
正规的网贷平台有哪些,不查征信... 正规的网贷平台有哪些目录正规的网贷平台有哪些不查征信的靠谱网贷平台有哪些正规的借贷平台有哪些?有哪些...
广东省普宁市属于哪个市,普宁是... 广东省普宁市属于哪个市目录广东省普宁市属于哪个市普宁是哪个是市的普宁属于哪个省哪个城市的?普宁市是哪...
雷洛科雷傲精彩改装案例(雷诺科... 今天给各位分享雷洛科雷傲精彩改装案例的知识,其中也会对雷诺科雷傲爆改进行解释,如果能碰巧解决你现在面...
国人难以忘却的经典解读丰田8A... 今天给各位分享国人难以忘却的经典解读丰田8A发动机的知识,其中也会对丰田8a发动机图片进行解释,如果...
2023张家口到北京的火车时刻... 今天给各位分享2023张家口到北京的火车时刻表查询,从张家口到北京...的知识,其中也会对张家口到北...
小狼狗是什么意思(小狼狗是啥)... 今天给各位分享小狼狗是什么意思的知识,其中也会对小狼狗是啥进行解释,如果能碰巧解决你现在面临的问题,...
苹果手机换购新款需要什么条件吗... 苹果最近的政策以旧换新需要办理什么手续,要身份证什么的吗?办过的才回答苹果旧机换新机的条件是什么? ...
ps怎么抠图详细步骤,ps最简... ps怎么抠图详细步骤目录ps怎么抠图详细步骤ps最简单的抠图方法的具体操作步骤怎么做?在线ps教程 ...
赴汤蹈火在所不辞的意思,赴汤蹈... 赴汤蹈火在所不辞的意思目录赴汤蹈火在所不辞的意思赴汤蹈火,再所不辞.赴汤蹈火的意思赴汤蹈火,在所不辞...
邮政报刊厅怎么申请 极速百科网... 邮政报刊厅怎么申请目录邮政报刊厅怎么申请邮政报刊厅怎么申请想开邮政报亭怎样办理!需要什么手续?邮政报...
新宝来和新朗逸选谁更好?网友:... 今天给各位分享新宝来和新朗逸选谁更好?网友:毫无悬念,朗逸全方位...的知识,其中也会对大众新宝来和...
pms系统是什么意思 极速百科... pms系统是什么意思目录pms系统是什么意思pms系统是什么意思mis系统是什么pms什么意思pms...
无影灯原理(无影灯原理图讲解)... 今天给各位分享无影灯原理的知识,其中也会对无影灯原理图讲解进行解释,如果能碰巧解决你现在面临的问题,...
蜂蜜的用途(蜂蜜的用途是什么)... 本篇文章极速百科给大家谈谈蜂蜜的用途,以及蜂蜜的用途是什么对应的知识点,希望对各位有所帮助,不要忘了...
16K纸有多大比A4的大还是小... 今天给各位分享16K纸有多大比A4的大还是小的知识,其中也会对16k的纸是a4纸的一半吗进行解释,如...
许昌新车上牌地址(许昌新车上牌... 今天给各位分享许昌新车上牌地址的知识,其中也会对许昌新车上牌地址查询进行解释,如果能碰巧解决你现在面...
八大艺术有哪些,艺术的八大类分... 八大艺术有哪些目录八大艺术有哪些艺术的八大类分别是什么世界公认的七大艺术是什么?什么被称八大艺术八大...
离我最近的北京现代4s店(离我... 本篇文章极速百科给大家谈谈离我最近的北京现代4s店,以及离我最近的北京现代4s店保养车对应的知识点,...
导轨油和机油的区别?(导轨油和... 今天给各位分享导轨油和机油的区别?的知识,其中也会对导轨油和机油的区别是什么进行解释,如果能碰巧解决...
免检卡板有什么好的,与熏蒸卡板... 本篇文章极速百科给大家谈谈免检卡板有什么好的,与熏蒸卡板有什么区别呢?,以及免检卡板图片对应的知识点...