Java String 对象,你真的了解了吗?
* When the intern method is invoked, if the pool already contains a * string equal to this {@code String} object as determined by * the {@link #equals(Object)} method, then the string from the pool is * returned. Otherwise, this {@code String} object is added to the * pool and a reference to this {@code String} object is returned. *
public native String intern(); 这是 intern() 函数的官方注释说明,大概意思就是 intern 函数用来返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。否则,在常量池中加入该对象,然后 返回引用。 有一位Twitter工程师在QCon全球软件开发大会上分享了一个他们对 String对象优化的案例,他们利用String.intern()方法将以前需要20G内存存储优化到只需要几百兆内存。这足以体现String.intern()的威力,我们一起来看一个例子,简单的了解一下String.intern()的用法。 public static void main(String[] args) { String str = new String("pingtouge"); String str1 = new String("pingtouge"); System.out.println("未使用intern()方法:"+(str==str1)); System.out.println("未使用intern()方法,str:"+str); System.out.println("未使用intern()方法,str1:"+str1); String str2= new String("pingtouge").intern(); String str3 = new String("pingtouge").intern(); System.out.println("使用intern()方法:"+(str2==str3)); System.out.println("使用intern()方法,str2:"+str2); System.out.println("使用intern()方法,str3:"+str3); } 从结果中可以看出,未使用String.intern()方法时,构造相同值的字符串对象返回不同的对象引用地址,使用String.intern()方法后,构造相同值的字符串对象时,返回相同的对象引用地址。这能帮我们节约不少空间 String.intern()方法虽然好,但是我们要结合场景使用,不能乱用,因为常量池的实现是类似于一个HashTable的实现方式,HashTable 存储的数据越大,遍历的时间复杂度就会增加。如果数据过大,会增加整个字符串常量池的负担。 灵活的字符串的分割 字符串的分割是字符串操作的常用操作之一,对于字符串的分割,大部分人使用的都是 Split() 方法,Split() 方法大多数情况下使用的是正则表达式,这种分割方式本身没有什么问题,但是由于正则表达式的性能是非常不稳定的,使用不恰当会引起回溯问题,很可能导致 CPU 居高不下。在以下两种情况下 Split() 方法不会使用正则表达式: 传入的参数长度为1,且不包含“.$|()[{^?*+\”regex元字符的情况下,不会使用正则表达式 传入的参数长度为2,第一个字符是反斜杠,并且第二个字符不是ASCII数字或ASCII字母的情况下,不会使用正则表达式 所以我们在字符串分割时,应该慎重使用 Split() 方法,首先考虑使用 String.indexOf() 方法进行字符串分割,如果 String.indexOf() 无法满足分割要求,再使用 Split() 方法,使用 Split() 方法分割字符串时,需要注意回溯问题。 文章不足之处,望大家多多指点,共同学习,共同进步 参考资料 Java性能调优实战 刘超 最后 打个小广告,欢迎扫码关注微信公众号:「平头哥的技术博文」,一起进步吧。 平头哥的技术博文 分类: Java 好文要顶 关注我 收藏该文 平头哥的技术博文 关注 - 0 粉丝 - 9 +加关注 1 0 « 上一篇: 装饰者模式,从吃黄焖鸡开始说起 posted @ 2019-09-24 10:14 平头哥的技术博文 阅读(150) 评论(0) 编辑 收藏 刷新评论刷新页面返回顶部 注册用户登录后才能发表评论,请 登录 或 注册, 访问 网站首页。 【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库 【活动】京东云限时优惠1.5折购云主机,最高返价值1000元礼品! 【推荐】零基础轻松玩转华为云产品,获壕礼加返百元大礼 【推荐】919 天翼云钜惠,全网低价,云主机9元轻松购 【推荐】华为云文字识别资源包重磅上市,1元万次限时抢购 【推荐】腾讯云海外云服务器1核2G19.8元/月 【福利】git pull && cherry-pick 博客园&华为云百万代金券 相关博文: · 你真的了解.NET中的String吗? · 你真的了解WebSocket吗? · 你真的了解 console 吗 · 你真的了解 “范式”吗? · 你真的了解UIGestureRecognizer吗? 最新 IT 新闻: · 史前人类很强壮?科学家:多是遭受饥荒的“老幼病残” · 三星显示器拟投资110亿美元升级韩国LCD工厂 · 前密西西比大学校长Jeffrey加入百度研究院 · 一加7T系列官方存储配置曝光:RAM最高支持12GB · Facebook中国程序员之死:年仅38岁跳楼轻生,浙大EE毕业生 » 更多新闻... 公告 昵称: 平头哥的技术博文 园龄: 1个月 粉丝: 9 关注: 0 +加关注 < 2019年9月 > 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 搜索 常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签 我的标签 数据结构(2) 数据结构与算法(1) 优先队列(1) 栈(1) Builder构建对象(1) Builder模式(1) SpringBoot(1) 本地缓存(1) 队列(1) 二叉树(1) 更多 随笔分类 Java(2) SpringBoot(1) 设计模式(5) 数据结构与算法(8) 随笔档案 2019年9月(7) 2019年8月(10) 最新评论 1. Re:装饰者模式,从吃黄焖鸡开始说起 讲真,这个设计是失败的,是片面的。 没有考虑点了又移除的情况(很明显,这个是刚需)。 装饰者模式不适合该应用场景。 --安度 2. Re:装饰者模式,从吃黄焖鸡开始说起 说的我。晚上想吃鸡了 --我叫锄头 3. Re:装饰者模式,从吃黄焖鸡开始说起 写的很好,很好理解 --试试帆布鞋 4. Re:装饰者模式,从吃黄焖鸡开始说起 写的生动有趣 --刺客伍六七 5. Re:HttpClient 三种 Http Basic Authentication 认证方式,你了解了吗? 头像不对啊,平头哥的发型不对 --安度 阅读排行榜 1. 程序员,你心里需要有点树(410) 2. 装饰者模式,从吃黄焖鸡开始说起(375) 3. 看完这篇你还不知道这些队列,我这些图白作了(366) 4. 为什么用枚举类来实现单例模式越来越流行?(362) 5. 实现 Java 本地缓存,该从这几点开始(339) 评论排行榜 1. 为什么用枚举类来实现单例模式越来越流行?(7) 2. 装饰者模式,从吃黄焖鸡开始说起(4) 3. HttpClient 三种 Http Basic Authentication 认证方式,你了解了吗?(1) 4. 程序员,你心里需要有点树(1) 推荐排行榜 1. 程序员,你心里需要有点树(3) 2. Java String 对象,你真的了解了吗?(1) 3. 装饰者模式,从吃黄焖鸡开始说起(1) 4. 程序员,你应该知道的基础排序算法(1) 5. 程序员,你应该知道的数据结构之哈https://www.cnblogs.com/jamaler/p/11576754.html