前言
明白什么是引用,什么是该引用指向的真正对象。
==对于基本数据类型比较的是值,对于引用数据类型比较的是指向的对象的地址,即两者指向的是否是同一个对象。

String s = "gzc";

上述代码中s为变量引用,它存在于栈中,而“gzc”则是该变量引用所指向的真正数据,它存在于字符串常量池中。

言归正传
字符串拼接主要有2种情况:
1、常量与常量拼接

String s1 = "g"+"zc";//常量“g”与常量“zc”拼接

常量与常量拼接的原理:
字符串常量与常量之间的拼接操作其实在未加载到JVM内存之前就已经完成了,即在编译期间就会对字符串常量之间的拼接操作进行优化
如下图,进行反编译后,我们不难发现在编译完之后,s4已经被直接拼接好了。而且此时s3和s4指向的是字符串常量池中的同一个对象,即两者存储的对象地址是相同的。所以s3==s4其结果为true。

2、涉及到变量的字符串拼接
2.1 变量与常量拼接

String s1 = "g";
String s2 = s1+"zc";//变量s1与常量“zc”拼接

2.2 变量与变量拼接

String s1 = "g";
String s2 = "zc";
String s3 = s1+s2;//变量s1与变量s2拼接

涉及到变量的字符串拼接原理:
只要字符串拼接其中涉及到变量,不管是几个变量,那么其拼接原理都如下:
当涉及到变量时,字符串用+进行字符串拼接的本质,其实就是利用StringBuilder类里的append()方法,将每一个字符串都一一添加进去,然后返回一个StringBuilder对象,所以可以不用新创建一个对象去接收返回值,直接链式编程得到最终添加的结果,最后再调用toString()方法将其转换为我们想要的字符串String类型。
如下图:

特别注意:
StringBuilder的toString()方法调用的是String重载的构造器方法,是以字符数组为字符串实际内容进行创建的,并未直接以字面量方式创建String对象,即:

所以如果我们上述代码没有定义s3和s4两个变量,只定义了String s5 = s1+s2; 的话,那么其实字符串常量池中是不存在“gzc”这个字符串的,而是只有“g”和“zc”。因为只有通过字面量定义一个字符串以及调用String的intern()方法,这两种方式才会在字符串常量池中生成对应的对象。
而StringBuilder调用toString()方法创建的String对象则会直接在堆中为其分配内存,常量池中不会存在对应的对象。所以如果判断s3==s5,则结果为false,因为s3指向的是字符串常量池中的“gzc”,而s5指向的是堆中的“gzc”对象,二者指向的对象地址不同,则比较结果自然为false。

特殊情况:若变量被声明为final类型,即为常量,则就遵循字符串常量拼接的规则了。如下图:

String字符串拼接原理相关推荐

  1. C# string为什么可以与int相加? string字符串拼接深入分析

    目录 前言 字符串拼接 分析 新的问题 结论 最后 拓展一:与struct相加 拓展二:Java的底层实现 前言 最近在研究关于string的一些东西,发现底层实现挺有意思的,想来研究下string字 ...

  2. Java字符串拼接原理

    JVM-字符串拼接原理 前置内容 java虚拟机栈 1.那些字符串会进入字符串常量池 直接写的字面量 字面量的拼接结果(注意:如果字符串拼接中有变量则结果不会进入字符串常量池) 调用String的in ...

  3. String字符串拼接小例

    >>>写出下面程序运行结果: public class StringTest {public static void main(String[] args) {String s1 = ...

  4. java字符串与数字拼接_Java数字和字符串拼接原理及案例

    字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起.都知道,String 是 Java 中一个不可变的类,所以一旦被实例化就无法被修改. 注意细节 字符是char 类型,字 ...

  5. String字符串拼接

    /*String:字符串,使用一对""引起来表示.1.String声明为final的,不可被继承2.String实现了Serializable接口:表示字符串是支持序列化的.实现了 ...

  6. java用 拼接字符串的原理_Java String 拼接字符串原理详解

    首先来一道思考题: String str1 = "111111"; String str2 = "222222"; String str = str1 + st ...

  7. C++string容器-字符串拼接

    string字符串拼接 功能描述: 实现在字符串末尾拼接字符串 函数原型: 代码如下: #include <iostream> using namespace std; #include ...

  8. Java对于字符串的处理【String和int之间的转换、字符串拼接、字符串获取长度、字符串大小写转换、字符串去空格、字符串分割、字符串替换、字符串提取、字符串比较、字符串查找】

    文章目录 String字符串 和 整型int 的相互转换 String转化为int int 转换为 String 字符串拼接 使用连接运算符 "+" 使用 concat() 方法 ...

  9. service 层 拼接的html 代码如何直接返回_字符串拼接,会走StringBuilder 吗?

    前言 最近在突然想到了String字符串拼接问题,于是做了一个demo测试了一下,到底String类型的字符串在拼接的时候,哪种情况下会走会走StringBulider进行字符串拼接,而哪种情况编译器 ...

  10. 面试:字符串拼接,什么时候用StringBuilder?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | www.jianshu.com/p/a80c9 ...

最新文章

  1. Lync server 2013 监控角色的安装
  2. StringCollection FAQ [C#, BCL]
  3. Java黑皮书课后题第8章:8.9(井字游戏)玩家使用各自标志标记3*3网格中的某个空格,当一个玩家在网格的水平、垂直或对角线方向标记了三个相同的标记时,游戏结束,该玩家获胜。创建一个玩井字游戏的程序
  4. python水平_如何在python中水平透视表
  5. 友盟分享小程序_在线学习应用“小打卡”小程序分享
  6. python 英语词频统计软件_Python实现统计英文文章词频的方法分析
  7. RocketMQ 顺序消费只消费一次 坑
  8. 简单的图论问题【湖南省赛】
  9. iOS NSString追加字符串的方法
  10. copy 和mutaleCopy
  11. lms自适应算法c语言,LMS算法(LMS自适应算法)
  12. 2022-2028年中国美容美发行业现状调研与未来前景趋势报告
  13. php向redis list一次性lpush多个值
  14. 2009年全国数模比赛,江苏三等奖名单
  15. 几种常见嵌入式实时操作系统简介
  16. matlab newton插值,(最新整理)Newton插值法
  17. 008-2018-09-12 文件操作
  18. 关于泰勒展开的细节-《三体》读后感的读后感...
  19. react 逆地理 高德地图_react高德地图默认卫星图设置
  20. 程序员跳槽时,如何高效地准备面试

热门文章

  1. 背离意味着趋势正在减弱
  2. poi生成word转pdf
  3. vue中的浏览量_vue项目中使用百度统计
  4. 单招面试问为什么选择计算机这个专业,单招面试常见问题及答案 面试要注意什么...
  5. vue设置proxy代理,如何去查看代理地址
  6. 国际区号json(含国家中英文名称、简称、区号、首拼)
  7. Android应用安全检测项目
  8. “24岁,一门手艺,年入百万”:真正厉害的人,都做到了这4件事
  9. 传销三级的认定标准_应为传销案件中“劳务性工作人员”争取“不起诉”—传销犯罪辩护与研究(四十五)...
  10. windows c语言编程环境,windows7中c语言编程环境的搭建