Java String 拼接字符串原理详解

 更新时间:2020年02月27日 10:37:53   作者:amCharlie  
在本篇文章里小编给大家分享的是关于Java String 拼接字符串原理详解的相关资源内容,有需要的朋友们可以跟着学习参考下。

首先来一道思考题:

String str1 = "111111";
String str2 = "222222";
String str = str1 + str2;
System.out.println(str);

很明确,上述代码输出的结果是:"111111222222",但是它工作原理是怎样的呢?

由于字符串拼接太常用了,java才支持可以直接用+号对两个字符串进行拼接。**其真正实现的原理是中间通过建立临时的StringBuilder对象,然后调用append方法实现**。如何验证呢?
上述代码文件写在Test.java main方法中,使用<b>javac Test.java</b>编译,在执行<b>javap -verbose Test</b>,可以看到如下信息:

0: ldc           #2                  // String 111111
2: astore_1
3: ldc           #3                  // String 222222
5: astore_2
6: new           #4                  // class java/lang/StringBuilder
9: dup
10: invokespecial #5                  // Method java/lang/StringBuilder."":()V
13: aload_1
14: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream;
28: aload_3
29: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
32: return

对于java来说,这段代码原理上应该是:

String str1 = "111111";
String str2 = "222222";
StringBuilder sb = new StringBuilder();
sb.append(str1);
sb.append(str2);
String str = sb.toString();
System.out.println(str);

再来一道思考题,如下代码的执行结果是什么?是报错,还是"null222222":

String str1 = null;
String str2 = "222222";
String str = str1 + str2;
System.out.println(str);

正确答案是:"null222222"。原理:

String str1 = null;
StringBuilder sb = new StringBuilder();
sb.append(str1 );

这段代码,StringBuilder对象append一个null字符串会怎么处理呢,这就要去查看源码了。源码中我们可以看到以下这段代码:

public StringBuilder append(StringBuffer sb) {
    super.append(sb);
    return this;
}

该方法继承了父类的方法,父类为AbstractStringBuilder,再去父类中查看:

private StringBuilder append(StringBuilder sb) {
    if (sb == null)
        return append("null");
    int len = sb.length();
    int newcount = count + len;
    if (newcount > value.length)
        expandCapacity(newcount);
    sb.getChars(0, len, value, count);
    count = newcount;
    return this;
}

真相大白了,这里null会变成"null"。因此答案就是"null222222"了。

总结:

String字符串拼接通过StringBuilder走中间过程,通过append方法实现

null拼接会变成字符串"null"

程序有大量字符串拼接时,建议考虑直接写StringBuilder实现,就不需要底层new很多临时sb对象了。

以上就是Java String 拼接字符串原理详解的详细内容,更多关于Java String 拼接字符串实例的资料请关注脚本之家其它相关文章!

相关文章

  • 如何设置springboot启动端口

    如何设置springboot启动端口

    spring boot是个好东西,可以不用容器直接在main方法中启动,而且无需配置文件,方便快速搭建环境。下面给大家介绍springboot启动端口的设置方法和spring boot创建应用端口冲突8080 问题,感兴趣的朋友一起看看吧
    2017-08-08
  • Java 替换字符串中的回车换行符的方法

    Java 替换字符串中的回车换行符的方法

    Java 替换字符串中的回车换行符的方法,需要的朋友可以参考一下
    2013-03-03
  • JAVA8获取list集合中重复的元素与获取去重数据实例

    JAVA8获取list集合中重复的元素与获取去重数据实例

    这篇文章主要给大家介绍了关于JAVA8获取list集合中重复的元素与获取去重数据的相关资料,在实际开发中经常会遇到需要找出(删除)一个list中某些元素的属性相同的元素,需要的朋友可以参考下
    2023-07-07
  • Java文件分级目录打包下载zip的实例代码

    Java文件分级目录打包下载zip的实例代码

    这篇文章主要介绍了Java文件分级目录打包下载zip的实例代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Spring Boot配置application.yml及根据application.yml选择启动配置的操作方法

    Spring Boot配置application.yml及根据application.yml选择启动配置的操作

    Spring Boot中可以选择applicant.properties 作为配置文件,也可以通过在application.yml中进行配置,让Spring Boot根据你的选择进行加载启动配置文件,本文给大家介绍Spring Boot配置application.yml及根据application.yml选择启动配置的操作方法,感兴趣的朋友一起看看吧
    2023-10-10
  • Java实现飞机大战-II游戏详解

    Java实现飞机大战-II游戏详解

    《飞机大战-II》是一款融合了街机、竞技等多种元素的经典射击手游。游戏是用java语言实现,采用了swing技术进行了界面化处理,感兴趣的可以了解一下
    2022-02-02
  • 一文教你掌握Java如何实现判空

    一文教你掌握Java如何实现判空

    实际项目中我们会有很多地方需要判空校验,如果不做判空校验则可能产生NullPointerException异常。所以本文小编为大家整理了Java中几个常见的判空方法,希望对大家有所帮助
    2023-04-04
  • java解析dbf之通过javadbf包生成和读取dbf文件

    java解析dbf之通过javadbf包生成和读取dbf文件

    这篇文章主要介绍了java通过javadbf读取和生成DBF文件的方法,大家参考使用吧
    2014-01-01
  • SpringBoot整合ELK实现日志监控

    SpringBoot整合ELK实现日志监控

    这篇文章主要为大家详细介绍了SpringBoot整合ELK实现日志监控的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • SpringBoot顶层接口实现类注入项目的方法示例

    SpringBoot顶层接口实现类注入项目的方法示例

    本文主要介绍了SpringBoot顶层接口实现类注入项目的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06

最新评论