字符串拼接操作


  • 常量与常量的拼接结果在常量池,原理是编译期优化

  • 常量池中不会存在相同内容的变量

  • 只要其中有一个是变量,结果就在堆中。变量拼接的原理是StringBuilder

  • 如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址

举例1:


public static void test1() {// 都是常量,前端编译期会进行代码优化String s1 = "a" + "b" + "c";  String s2 = "abc"; // true,有上述可知,s1和s2实际上指向字符串常量池中的同一个值System.out.println(s1 == s2); } 

反编译为class文件后,会发现 String s1 = “abc”; 说明代码在编译期进行了优化

举例2:


public static void test2() {String s1 = "javaEE";String s2 = "hadoop";String s3 = "javaEEhadoop";String s4 = "javaEE" + "hadoop";    String s5 = s1 + "hadoop";String s6 = "javaEE" + s2;String s7 = s1 + s2;System.out.println(s3 == s4); // true 编译期优化System.out.println(s3 == s5); // false s1是变量,不能编译期优化System.out.println(s3 == s6); // false s2是变量,不能编译期优化System.out.println(s3 == s7); // false s1、s2都是变量System.out.println(s5 == s6); // false s5、s6 不同的对象实例System.out.println(s5 == s7); // false s5、s7 不同的对象实例System.out.println(s6 == s7); // false s6、s7 不同的对象实例String s8 = s6.intern();System.out.println(s3 == s8); // true intern之后,s8和s3一样,指向字符串常量池中的"javaEEhadoop"} 

变量拼接原理:

当两个变量:String s1=“a”;String s2=“b”;相加时:其执行细节如下:

①StringBuilder s=new StringBuilder();

②s.append(“a”);

③s.append(“b”);

④s.toString();

举例3:


public void test3(){String s0 = "ab";String s1 = "a";String s2 = "b";String s3 = s1 + s2;System.out.println(s0 == s3); // false s3指向对象实例,s0指向字符串常量池中的"ab"String s7 = "cd";final String s4 = "c";final String s5 = "d";String s6 = s4 + s5;System.out.println(s6 == s7); // true s4和s5是final修饰的,编译期就能确定s6的值了} 

字符串拼接操作不一定使用的时StringBuilder,如果使用final修饰,即为常量,会在编译器进行代码优化。如果不使用final修饰,即为变量,会通过new StringBuilder进行拼接。在实际开发中,能够使用final的,尽量使用。

举例4:

字符串拼接操作性能对比:


public class Test{    public static void main(String[] args) {        int times = 40000;        long start = System.currentTimeMillis();        testString(times);    // String  6963ms //testStringBuilder(times); // StringBuilder    2ms long end = System.currentTimeMillis();        System.out.println("String: " + (end-start) + "ms");        }    public static void testString(int times) {        String str = "";        for (int i = 0; i < times; i++) {            str += "test";        }    }    public static void testStringBuilder(int times) {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < times; i++) {            sb.append("test");        }    }    } 

结果: 通过StringBuilder的append()的方式添加字符串的效率要远高于使用Sting的字符串拼接方式。

详情: StringBuilder的append()方式:自始至终只创建过一个StringBuilder的对象,使用String的字符串拼接方式,执行过程中会创建多个StringBuilder和String对象,内存占用较大,如果进行GC,还需要花费额外的时间。

intern()的使用


intern():将字符串对象尝试放入串池,首先判断字符串常量池中是否存在对应的字符串值,如果存在则返回常量池中字符串的地址,如果不存在,则在常量池中添加该字符串,并返回对应的地址。

intern是一个native方法,调用的是底层C的方法。

Interned string确保字符串在内存里只有一份拷贝,这样可以节约内存空间,加快字符串操作任务的执行速度。注意,这个值会被存放在字符串内部池(String Intern Pool)。

空间效率:对于程序中大量使用存在的字符串时,尤其存在很多已经重复的字符串时,使用intern()方法能够节省内存空间。


面试题:new String(“ab”)会创建几个对象?

String s = new String("ab");创建了两个对象:堆空间中一个new对象 ,字符串常量池中一个字符串常量"ab"(如果此时字符串常量池中已有该常量则不会创建)

面试题:new String(“a”)+new String(“b”)会创建几个对象?

《MySql面试专题》

《MySql性能优化的21个最佳实践》

《MySQL高级知识笔记》

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

获取方式:点击这里前往传送门

…(img-HyBCQz4v-1628592082565)]

[外链图片转存中…(img-PLHaorbD-1628592082566)]

[外链图片转存中…(img-Wlxssaxk-1628592082567)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中…(img-YTA1ukGT-1628592082568)]

获取方式:点击这里前往传送门

关注我,点赞本文给更多有需要的人

String的内存分配与拼接操作,华为架构师深入讲解Java开发相关推荐

  1. JVM学习笔记之-StringTable String的基本特性,内存分配,基本操作,拼接操作,intern()的使用,垃圾回收 ,G1中的String去重操作

    String的基本特性 string:字符串,使用一对""引起来表示. String s1 = ""; //字面量的定义方式 String s2 = new S ...

  2. String 对象内存分配策略

    这个问题可以说是一个高频的面试题目,以前把这个问题弄懂了,最近突然想到这个问题,一时间竟然没有太好的思路了.所以花些时间整理一下其中的知识点. 一.内存分配策略 我们先来看一个题目(这个问题都快看吐了 ...

  3. java内存模型 创建类_JVM内存模型及String对象内存分配

    昨天看了一篇关于<Java后端程序员1年工作经验总结>的文章,其中有一段关于String和StringBuffer的描述,对于执行结果仍然把握不准,趁此机会也总结了下JVM内存模型. 1. ...

  4. harmonyos基于arm么,华为架构师解读:HarmonyOS低时延高可靠消息传输原理

    华为架构师解读:HarmonyOS低时延高可靠消息传输原理 [复制链接] 本文作者:zhangkesi,华为软件架构设计工程师 这是一篇HarmonyOS低时延高可靠消息传输原理的介绍,希望对你有所帮 ...

  5. 华为架构师8年经验谈:从单体架构到微服务的服务化演进之路

    本次分享的技术大纲如下: 传统应用开发面临的挑战 服务化实践 服务化不是银弹 服务化架构的演进方向 一 .传统应用开发面临的挑战 挑战1-- 研发成本高 主要体现在如下几个方面: 代码重复率高 在实际 ...

  6. 华为架构师撰写的Netty核心笔记,从Java NIO到Netty的高级特性

    众所周知,Netty 作为当前流行的 NIO 框架,操作省时.省事还安全,在云计算.大数据通讯,电商.游戏等领域都有广泛的应用.如果是一个大型网站,内部接口非常多的情况下,好处很明显--首先就是长链接 ...

  7. 华为面试100题:java开发工程师(中)

    sleep和wait经常被面试官问到,它们的区别如下: 1.sleep是Thread类的静态本地方法,wait则是Object类的本地方法. 2.sleep方法不会释放lock,但wait会释放,而且 ...

  8. 华为面试100题:java开发工程师(上)

    jkd的组成结构  java的跨平台是通过jvm虚拟机实现的  java代码执行流程 首先java代码通过javac编译成.class文件,.class文件进入类装载子系统,装载进入运行时数据区,通过 ...

  9. 华为架构师整理Redis数据结构的大厂最佳实践

    1 概述 数据结构和内部编码 无传统关系型数据库的 Table 模型 schema 所对应的db仅以编号区分.同一 db 内,key 作为顶层模型,它的值是扁平化的.即 db 就是key的命名空间. ...

最新文章

  1. Jquery php 点击td变成input,修改后失去焦点发送数据
  2. mysql中timestamp类型数据查找中出现的问题
  3. 【福利】思科/华为/华三模拟器软件分享,附下载链接
  4. 如何利用msxsl绕过AppLocker?
  5. 手写哈希(实现简单的加数、查询)
  6. 广播风暴检测_什么是广播路由算法?如何解决广播风暴?
  7. ps图层高级扩展知识
  8. 正确理解jmeter线程组之Ramp-Up
  9. 域渗透非约束委派Spooler
  10. RAM与ROM的区别
  11. win 32 学习笔记(十) 对话框
  12. Quick BI可以帮助我们大大提升响应速度
  13. 苹果服务器维护不能刷机,iphone刷机失败不开机报错维修方法分享
  14. Drools从入门到精通
  15. 小白入门:python sklearn之kmeans
  16. 量化交易 米筐 策略回测总结
  17. 开到370多家线下门店后,特斯拉掉头主攻线上是好事吗?...
  18. 下班后有什么可以做的副业?分享几个靠谱线上和线下副业
  19. 碳酸锂、碳酸氢锂除钙镁离子交换柱
  20. 分区助手怎么用给c盘扩容

热门文章

  1. Macaca简单入门
  2. 中国酸2-葡萄糖苷(AA2G)市场趋势报告、技术动态创新及市场预测
  3. 两级压缩机行业调研报告 - 市场现状分析与发展前景预测
  4. 转载 WHO OWNS THE MOST SERVERS ?
  5. 为什么不能完全相信自动驾驶?
  6. 谷歌称远程办公影响工作效率,2021年回归线下办公
  7. 任正非就注册姚安娜商标道歉;人人影视字幕组因盗版被查;JIRA、Confluence 等产品本月停售本地化版本 | 极客头条...
  8. 专访华为杨海松:立足合作伙伴价值,构建健康HarmonyOS生态
  9. 百度智能云发布『乘风』 端云一体化方案 助力人脸应用10分钟落地
  10. 一个月 200 题,命中 80%,拿下 BAT,我独特的高效刷题法