字符串拼接+和concat的区别

+和concat都可以用来拼接字符串,但在使用上有什么区别呢,先来看看这个例子。

public static void main(String[] args) {
    // example1
    String str1 = "s1";
    System.out.println(str1 + 100);//s1100
    System.out.println(100 + str1);//100s1

    String str2 = "s2";
    str2 = str2.concat("a").concat("bc");
    System.out.println(str2);//s2abc


    // example2
    String str3 = "s3";
    System.out.println(str3 + null);//s3null
    System.out.println(null + str3);//nulls3

    String str4 = null;
    System.out.println(str4.concat("a"));//NullPointerException
    System.out.println("a".concat(str4));//NullPointerException
}

concat源码:

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

看下生成的字节码:

所以可以得出以下结论:

  • +可以是字符串或者数字及其他基本类型数据,而concat只能接收字符串。
  • +左右可以为null,concat为会空指针。
  • 如果拼接空字符串,concat会稍快,在速度上两者可以忽略不计,如果拼接更多字符串建议用StringBuilder。
  • 从字节码来看+号编译后就是使用了StringBuiler来拼接,所以一行+++的语句就会创建一个StringBuilder,多条+++语句就会创建多个,所以为什么建议用StringBuilder的原因。

看完有没有收获?

分享到朋友圈给更多的人吧。

原文发布于微信公众号 - Java技术栈(javastack)

原文发表时间:2017-09-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

10个有关String的面试问题

简单来讲,“==”测试的是两个对象的引用是否相同,而equals()比较的是两个字符串的值是否相等。除非你想检查的是两个字符串是否是同一个对象,否则你应该使用e...

7720
来自专栏编程直播室

读书笔记:《算法图解》第二章 选择排序选择排序:#

19740
来自专栏CDA数据分析师

Python迭代和迭代器详解

一个对象,物理或者虚拟存储的序列。list,tuple,strins,dicttionary,set以及生成器对象都是可迭代的,整型数是不可迭代的。如果你不确定...

22490
来自专栏程序员互动联盟

【编程基础】聊聊C语言-常用运算符

上一篇我们讲了C语言中的基本运算符,他们就像基石一样奠定了我们进行基本算术运算的基础。我们马上将上一篇留得题的答案公布如下: 5/4=1 5.0/4=1.250...

42070
来自专栏Java帮帮-微信公众号-技术文章全总结

细说反射,Java 和 Android 开发者必须跨越的坎【面试+工作】

我来翻译一下:反射技术通常被用来检测和改变应用程序在 Java 虚拟机中的行为表现。它是一个相对而言比较高级的技术,通常它应用的前提是开发者本身对于 Java ...

19840
来自专栏程序员互动联盟

【编程基础】Java的接口和抽象类

对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人...

30570
来自专栏Golang语言社区

第十一节 Go语言数组

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

10930
来自专栏Phoenix的Android之旅

如何用反射突破private方法的限制

反射作为Java的一个提高点,经常作为面试的内容之一。今天介绍一下最基本的反射的使用。 如何用反射来使用Class中的private方法。

14820
来自专栏微信公众号:Java团长

深入理解Java的接口和抽象类

  对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很...

10020
来自专栏一“技”之长

Swift解读专题二——基本类型 原

        Swift语言的常量和变量在使用之前,必须被定义。常量用于处理程序中只在初始化时设置的量值,之后不能进行赋值改变,变量用于处理程序中可以进行改变...

6930

扫码关注云+社区

领取腾讯云代金券