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

public void test1() {
String s1 = "a" + "b" + "c";//等同于"abc"
String s2 = "abc"; //"abc"-定是放在字符串常量池中,将此地址赋给s2
/*
*最终.java编译成.class,再执行. class
* string s1 = "abc";
* string s2 = "abc
*/
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true }

2.常量池中不会存在相同内容的常量。

public 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
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false
//intern():判断宇符串常量池中是否存在javaEEhadoop值,如果存在,则返回常量池中javaEEhadoop的地址:
//如果字符串常量池中不存在javaEEhadoop,则在常量池中加载一份javaEEhadoop, 并返回此对象的地址。
String s8 = s6.intern();
System.out.println(s3 == s8);//true
}

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

public void test3() {
String s1 = "a";
String s2 = "b";
String s3 = "ab";
/*
如下的s1 + s2的执行细节: (变量s是我临时定义的)
1、StringBuilder s = new stringBuilder();
2、s. append("a")
3、s.append("b")
4、s.tostring() --> 约等于new string( "ab")
补充:在jdk5. 0之后使用的是StringBuilder,在jdk5.0之前使用的是stringBuffer
*/
String s4 = s1 + s2;//
System.out.println(s3 == s4);//false
} /*
1.字符串拼接操作不一-定使用的是stringBuilder!
如果拼接符号左右两边都是字符串常量或常量引用,则仍然使用编译期优化,即非stringBuilder的方式。
2.针对于final 修饰类、方法、基本数据类型、引用数据类型的量的结构时,能使用上final的时候建议使用上。
*/
public void test4() {
final String s1 = "a";
final String s2 = "b";
String s3 = "ab";
String s4 = s1 + s2;
System.out.println(s3 == s4);//true
} public void test5() {
String s1 = "javaEEhadoop";
String s2 = "javaEE";
String s3 = s2 + "hadoop";
System.out.println(s1 == s3);//false
final String s4 = "javaEE";//s4:常量
String s5 = s4 + "hadoop";
System.out.println(s1 == s5);//true
}

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

拼接操作的效率对比:

通过StringBuilder 的append()的方式添加字符申的效率要远高于使用String的字符串拼接方式!
详情:1、StringBuilder的append()的方式:自始至终中只创建过-个StringBuilder的对象,使用String的字符串拼接方式:创建过多个StringBuilder和String的对象
   2、使用String的字符串拼接方式:内存中由于创建7铰多的StringBuilder和String的对象, 内存占用更大:如果进行GC,需要花费额外的时间

改进的空间:在实际开发中,如果基本确定要前前后后添加的字符串长度不高于某个限定值highLevel的情况下,建议使用构造器
StringBuilder s = new StringBuilder(highLevel);//new char[highLevel ]

intern()说明

String s = new String("1");
s. intern();//调用此方法之前,字符串常量池中已经存在了"1”
String s2 = "1";
System. out . println(s == s2);//jdk6: false jdk7/8: false
String s3 = new String("1") + new String("1");//s3变量记录的地址为: new String("11")
//执行完上一行代码以后,字符串常量池中,是否存在"11"呢?答案:不存在! !
s3. intern();//在字符串常量池中生成"11”。如何理解: jdk6: 创建了一个新的对象"11", 也就有新的地址。
//jdk7:此时常量中并没有创建"11",而是创建一个指向堆空间
String s4 = "11" ;//s4变量记录的地址:使用的是上一行代码执行时,在常量池中生成的"11”的地址
System. out . println(s3 == s4);//jdk6: false jdk7/8: true

new String("a") + new string("b")创建了几个对象?

对象1: new stringBuilder()
对象2: new string("a")
对象3: 常量池中的"a”
对象4: new String("b")
对象5: 常量池中的"b”

深入剖析: StringBuilder的tostring():
对象6 : new string( "ab")
强调一下,tostring()的调用,在字符串常量池中,没有生成"ab"

JAVA字符串拼接操作规则说明的更多相关文章

  1. JavaScript如何实现字符串拼接操作

    实际应用中,目标字符串的生成可能需要多个数据的拼接. 由于应用频繁,几乎是所有编程语言都必须掌握的操作,当然每种语言具有各自特点. 本文将通过代码实例详细介绍一下JavaScript如何实现字符串拼接 ...

  2. Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次

    [请尊重原创版权,如需引用,请注明来源及地址] > 字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有以下五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现 ...

  3. Java 字符串拼接 StringBuilder() StringBuffer

            字符串拼接 普通方式 public class StringDemo2 { public static void main(String[] args) { // 表示获取从1970- ...

  4. Java 字符串拼接四种方式的性能比较分析

    一.简单介绍 编写代码过程中,使用"+"和"contact"比较普遍,但是它们都不能满足大数据量的处理,一般情况下有一下四种方法处理字符串拼接,如下: 1. 加 ...

  5. 羞,Java 字符串拼接竟然有这么多姿势

    二哥,我今年大二,看你分享的<阿里巴巴 Java 开发手册>上有一段内容说:"循环体内,拼接字符串最好使用 StringBuilder 的 append 方法,而不是 + 号操作 ...

  6. Java字符串连接操作的性能问题

    首先,看一段实验程序: package com.test; class StringTest { public static void main(String[] args) { long start ...

  7. learning java 字符串常用操作

    // 字符串索引取值 "; System.)); // 字符串比较 "; "; "; System.out.println(s1.compareTo(s2)); ...

  8. java 字符串拼接

    package com.fh.controller.pacm.checkbill; import com.google.common.base.Joiner; /** * 字符串拼接 * * @aut ...

  9. Java 字符串拼接方式

    import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; impor ...

随机推荐

  1. DirectX12 3D 游戏开发与实战第五章内容

    渲染流水线 学习目标: 了解用于在2D图像中表现出场景立体感和空间深度感等真实效果的关键因素 探索如何用Direct3D表示3D对象 学习如何建立虚拟摄像机 理解渲染流水线,根据给定的3D场景的几何描 ...

  2. dotnet 将自动代码格式化机器人带入团队 GitLab 平台

    给团队带入一个 代码格式化机器人 能提升团队的幸福度,让团队的成员安心写代码,不用关注代码格式化问题,将格式代码这个粗活交给机器人去做.同时也能减少在代码审查里撕格式化问题的时间,让更多的时间投入到更 ...

  3. FESTUNG模型介绍—1.对流方程求解

    FESTUNG模型介绍-1.对流方程求解 1. 控制方程 对流问题中,控制方程表达式为 \[\partial_t C + \partial_x (u^1 C) + \partial_y (u^2 C) ...

  4. 【Meta】16s rRNA和16s rDNA的区别

    在文章或宣传稿中经常看到两者滥用,实际上是不同的. 首先是各个字母的含义: 16S中的"S"是一个沉降系数,亦即反映生物大分子在离心场中向下沉降速度的一个指标,值越高,说明分子越大 ...

  5. [R] read.table的check.names参数防止读入数据时列名前自动加上"X."

    最近用之前写的R脚本重新跑数据时,出现了报错.经检查,才发现是数据的列名读入R时发生了变化,列名前自动加上了X.符号. read.table系列函数有一个check.names参数,默认为 TRUE ...

  6. C++20协程实例:携程化的IOCP服务端/客户端

    VC支持协程已经有一段时间了,之前一直想不明白协程的意义在哪里,前几天拉屎的时候突然灵光一闪: 以下是伪代码: task server() { for (;;) { sock_context s = ...

  7. 分布式事务(3)---强一致性分布式事务Atomikos实战

    分布式事务(1)-理论基础 分布式事务(2)---强一致性分布式事务解决方案 分布式事务(4)---最终一致性方案之TCC 前面介绍强一致性分布式解决方案,这里用Atomikos框架写一个实战的dem ...

  8. A Child's History of England.45

    To forgive these unworthy princes was only to afford them breathing-time for new faithlessness. They ...

  9. Spark(十六)【SparkStreaming基本使用】

    目录 一. SparkStreaming简介 1. 相关术语 2. SparkStreaming概念 3. SparkStreaming架构 4. 背压机制 二. Dstream入门 1. WordC ...

  10. 4.3 rust func closure

    fn add_one_v1 (x: u32) -> u32 { x + 1 } let add_one_v2 = |x: u32| -> u32 { x + 1 }; let add_on ...